www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Linking to C

reply scrappylildude <sdl yahoo.com> writes:
Hello,

New to D, but I am loving it so far.

I am having some trouble linking to a C library static library (LibRaw 0.10.0).
 I ran htod on the LibRaw
header files, and fixed up the resulting file by hand.

Now when I compile and attempt to link, I get one error:

Undefined symbols:
  "_D16libraw_c_headers12__ModuleInfoZ", referenced from:
      _D10helloworld12__ModuleInfoZ in helloworld.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
--- errorlevel 1

Obviously I don't have any identifiers by these names.  I wrote a simple
library which printf's "Hello
World" and linked to it without problems.  So I thought the problem might be
due to name mangling
incompatibilities, so I recompiled libraw under gcc4.2 and llvm-gcc and got the
same issue both times.

Can anyone provide a clue?  I know the linker can't resolve the above, but I
have no idea how to go
about fixing it.

Environment: Mac OS X 10.6.4, DMD v2.049.
Nov 02 2010
next sibling parent Mike Chaten <mchaten gmail.com> writes:
How are you compiling & linking the files? I've gotten this error before
when I forgot to include a file in my compilation (in your case
libraw_c_headers)

On Tue, Nov 2, 2010 at 8:47 PM, scrappylildude <sdl yahoo.com> wrote:

 Hello,

 New to D, but I am loving it so far.

 I am having some trouble linking to a C library static library (LibRaw
 0.10.0).  I ran htod on the LibRaw
 header files, and fixed up the resulting file by hand.

 Now when I compile and attempt to link, I get one error:

 Undefined symbols:
  "_D16libraw_c_headers12__ModuleInfoZ", referenced from:
      _D10helloworld12__ModuleInfoZ in helloworld.o
 ld: symbol(s) not found
 collect2: ld returned 1 exit status
 --- errorlevel 1

 Obviously I don't have any identifiers by these names.  I wrote a simple
 library which printf's "Hello
 World" and linked to it without problems.  So I thought the problem might
 be due to name mangling
 incompatibilities, so I recompiled libraw under gcc4.2 and llvm-gcc and got
 the same issue both times.

 Can anyone provide a clue?  I know the linker can't resolve the above, but
 I have no idea how to go
 about fixing it.

 Environment: Mac OS X 10.6.4, DMD v2.049.
Nov 02 2010
prev sibling parent reply Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
On 11/2/10 7:47 PM, scrappylildude wrote:
 Hello,

 New to D, but I am loving it so far.

 I am having some trouble linking to a C library static library (LibRaw
0.10.0).  I ran htod on the LibRaw
 header files, and fixed up the resulting file by hand.

 Now when I compile and attempt to link, I get one error:

 Undefined symbols:
    "_D16libraw_c_headers12__ModuleInfoZ", referenced from:
        _D10helloworld12__ModuleInfoZ in helloworld.o
 ld: symbol(s) not found
 collect2: ld returned 1 exit status
 --- errorlevel 1

 Obviously I don't have any identifiers by these names.  I wrote a simple
library which printf's "Hello
 World" and linked to it without problems.  So I thought the problem might be
due to name mangling
 incompatibilities, so I recompiled libraw under gcc4.2 and llvm-gcc and got
the same issue both times.

 Can anyone provide a clue?  I know the linker can't resolve the above, but I
have no idea how to go
 about fixing it.

 Environment: Mac OS X 10.6.4, DMD v2.049.
Say you used htod obtaining libraw_c_headers.d and then used import in some D program like this: // File myfile.d import libraw_c_headers; ... more D code ... In that case, the module libraw_c_headers.d needs to be actually included in the build. For example, I assume you now do: $ dmd myfile.d Hi, this is your linker and I'll output an incomprehensible message. $ _ You need to do: $ dmd myfile.d libraw_c_headers.d $ _ Andrei
Nov 02 2010
parent reply scrappylildude <sdl yahoo.com> writes:
Thank you Andrei!

I thought because I had imported libraw_c_headers.d in myfile.d that I didn't
need to do
that.

Thank you, it works perfectly.

P.S. Sorry, perhaps this question should have been posted in D.Learn?
Nov 02 2010
next sibling parent "Nick Sabalausky" <a a.a> writes:
"scrappylildude" <sdl yahoo.com> wrote in message 
news:iaqgha$1p6k$1 digitalmars.com...
 Thank you Andrei!

 I thought because I had imported libraw_c_headers.d in myfile.d that I 
 didn't need to do
 that.
If you use something like rdmd or xfbuild then you can just specify the "main" D file, and it'll automatically find all dependencies like that.
 P.S. Sorry, perhaps this question should have been posted in D.Learn?
Probably, but we're not too strict :)
Nov 02 2010
prev sibling parent reply Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
On 11/2/10 9:14 PM, scrappylildude wrote:
 Thank you Andrei!

 I thought because I had imported libraw_c_headers.d in myfile.d that I didn't
need to do
 that.

 Thank you, it works perfectly.

 P.S. Sorry, perhaps this question should have been posted in D.Learn?
rdmd takes care of figuring out dependencies: http://www.digitalmars.com/d/2.0/rdmd.html If you just say $ rdmd --build-only myfile.d $ _ then rdmd will figure out that myfile.d depends on libraw_c_headers.d and link it in automatically. See http://www.digitalmars.com/d/2.0/rdmd.html. Andrei
Nov 02 2010
parent reply scrappylildude <sdl yahoo.com> writes:
That's great--thanks Nick, Andrei.

I tried it and it looks like I haven't configured something right.   I'm
building a sample
project with my program, my utility class library and libraw.  I've added the
path to
libraw_c_headers.d to dmd.conf, now that I don't have a -I switch any more
(using
rdmd).

When I use rdmd, something like my original error seems to have returned:  :(

rdmd --build-only helloworld.d

Undefined symbols:  "_D4hecl4base8HECLBase11__InterfaceZ", referenced from:
_D4hecl4base12__ModuleInfoZ in helloworld.d.old: symbol(s) not foundcollect2: ld
returned 1 exit status
--- errorlevel 1

My project is organized as follows:
root/
    stuff_i_made/
        my project/
            helloworld.d
        my class library/
            hecl*.d
    stuff_I_didnt_make/
        libraw/
            lib/
                libraw_r.a
            src/
                libraw_c_headers.d

Using --dry-run seems to show everything except the libraw_r.a.  Since I don't
have a
-L switch with rdmd, I assume this is the problem?
Nov 02 2010
next sibling parent "Nick Sabalausky" <a a.a> writes:
"scrappylildude" <sdl yahoo.com> wrote in message 
news:iaqu6l$2sq5$1 digitalmars.com...
 That's great--thanks Nick, Andrei.

 I tried it and it looks like I haven't configured something right.   I'm 
 building a sample
 project with my program, my utility class library and libraw.  I've added 
 the path to
 libraw_c_headers.d to dmd.conf, now that I don't have a -I switch any more 
 (using
 rdmd).

 When I use rdmd, something like my original error seems to have returned: 
 :(

 rdmd --build-only helloworld.d

 Undefined symbols:  "_D4hecl4base8HECLBase11__InterfaceZ", referenced 
 from:
 _D4hecl4base12__ModuleInfoZ in helloworld.d.old: symbol(s) not 
 foundcollect2: ld
 returned 1 exit status
 --- errorlevel 1

 My project is organized as follows:
 root/
    stuff_i_made/
        my project/
            helloworld.d
        my class library/
            hecl*.d
    stuff_I_didnt_make/
        libraw/
            lib/
                libraw_r.a
            src/
                libraw_c_headers.d

 Using --dry-run seems to show everything except the libraw_r.a.  Since I 
 don't have a
 -L switch with rdmd, I assume this is the problem?
Oh that's right, I forgot you said you were linking against a static C lib. There's currently three bugs in RDMD relating to what you're doing here, two of them have patches though: http://d.puremagic.com/issues/show_bug.cgi?id=3564 http://d.puremagic.com/issues/show_bug.cgi?id=4672 http://d.puremagic.com/issues/show_bug.cgi?id=4928 Until those get sorted out (or at least the first one, and then apply the patches from the other two), then yea, you'll probably have to work around it by just passing everything to dmd directly: dmd "stuff_i_made/my project/helloworld.d" "stuff_i_made/my class library/hecl*.d" stuff_I_didnt_make/libraw/lib/libraw_r.a stuff_I_didnt_make/libraw/src/libraw_c_headers.d If you're using D1, you could probably use xfbuild (don't have link offhand, but should be easy to google).
Nov 02 2010
prev sibling parent reply Mike Chaten <mchaten gmail.com> writes:
Any options with just one dash afaik (ala -L) will pass through to dmd.

On Wed, Nov 3, 2010 at 2:07 AM, scrappylildude <sdl yahoo.com> wrote:

 That's great--thanks Nick, Andrei.

 I tried it and it looks like I haven't configured something right.   I'm
 building a sample
 project with my program, my utility class library and libraw.  I've added
 the path to
 libraw_c_headers.d to dmd.conf, now that I don't have a -I switch any more
 (using
 rdmd).

 When I use rdmd, something like my original error seems to have returned:
  :(

 rdmd --build-only helloworld.d

 Undefined symbols:  "_D4hecl4base8HECLBase11__InterfaceZ", referenced from:
 _D4hecl4base12__ModuleInfoZ in helloworld.d.old: symbol(s) not
 foundcollect2: ld
 returned 1 exit status
 --- errorlevel 1

 My project is organized as follows:
 root/
    stuff_i_made/
        my project/
            helloworld.d
        my class library/
            hecl*.d
    stuff_I_didnt_make/
        libraw/
            lib/
                libraw_r.a
            src/
                libraw_c_headers.d

 Using --dry-run seems to show everything except the libraw_r.a.  Since I
 don't have a
 -L switch with rdmd, I assume this is the problem?
Nov 02 2010
parent "Nick Sabalausky" <a a.a> writes:
 Any options with just one dash afaik (ala -L) will pass through to dmd.
Yes, although they have to come before the main D file, so it has to be like this: rdmd -Lwhatever main.d NOT: rdmd main.d -Lwhatever
Nov 02 2010