Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
November 24, 2013 Calling D from C | ||||
---|---|---|---|---|
| ||||
I haven't been able to make calling D from C on Mac OS 10.9 work. I tried the following simple example: foo.d import std.stdio; extern(C) int add(int x, int y){ return x + y; } bar.c #include <stdio.h> int add(int , int); int main(){ int x = 1; int y = 2; char s[] = "%d + %d = %d"; printf(s, x, y, add(x,y)); } bash calls: dmd -c foo.d gcc bar.c foo.o This gives a long error, summarized as ld: symbol(s) not found for architecture x86_64 (FYI, in Mac OS 10.9 the aging gcc version has apparently been replaced with a more recent version of clang, so the above gcc call is actually some version of clang: gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix) Is there some way to make this work? I'd like to call D code from C, and I'm fine statically compiling the D code and linking it to C. |
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to CJS | On Sunday, 24 November 2013 at 05:25:36 UTC, CJS wrote:
>
> bash calls:
> dmd -c foo.d
> gcc bar.c foo.o
>
this is wrong. there should flag for building static lib which should produce foo.a which then you link with C build.
|
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to evilrat | On Sunday, 24 November 2013 at 05:54:44 UTC, evilrat wrote:
> On Sunday, 24 November 2013 at 05:25:36 UTC, CJS wrote:
>>
>> bash calls:
>> dmd -c foo.d
>> gcc bar.c foo.o
>>
>
> this is wrong. there should flag for building static lib which should produce foo.a which then you link with C build.
There isn't anything special about .a files, they just contain multiple .o "collections"
He looks to be missing an initialization of the runtime, but then again thought I read something about a trick making that not needed (at least for dynamic loading)... Someone else will have to pitch in what the correct solution is.
|
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On Sunday, 24 November 2013 at 06:48:50 UTC, Jesse Phillips wrote:
> On Sunday, 24 November 2013 at 05:54:44 UTC, evilrat wrote:
>> On Sunday, 24 November 2013 at 05:25:36 UTC, CJS wrote:
>>>
>>> bash calls:
>>> dmd -c foo.d
>>> gcc bar.c foo.o
>>>
>>
>> this is wrong. there should flag for building static lib which should produce foo.a which then you link with C build.
>
> There isn't anything special about .a files, they just contain multiple .o "collections"
>
> He looks to be missing an initialization of the runtime, but then again thought I read something about a trick making that not needed (at least for dynamic loading)... Someone else will have to pitch in what the correct solution is.
this is not about runtime, ld(linker) reports missing symbols, so it is either x86/x64 versions mismatch, or maybe with dmd 2.064 it is necessary to mark exported symbols with "export" keyword
|
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to CJS | On Sunday, 24 November 2013 at 05:25:36 UTC, CJS wrote: > dmd -c foo.d > gcc bar.c foo.o ok i find out what's your problem. here is 2 ways of solving this problem. 1) build like you do already but add to gcc call phobos lib, so it will looks like "gcc bar.c foo.o /usr/share/dmd/lib/libphobos2.a" 2) build with foo.d with "dmd foo.d -lib" which generates proper lib file with all necessary stuff from phobos and whatever. i specifically choose this order so you can think whats happened. |
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to evilrat | On Sunday, 24 November 2013 at 07:22:37 UTC, evilrat wrote:
> On Sunday, 24 November 2013 at 05:25:36 UTC, CJS wrote:
>> dmd -c foo.d
>> gcc bar.c foo.o
>
>
> ok i find out what's your problem. here is 2 ways of solving this problem.
>
> 1) build like you do already but add to gcc call phobos lib, so it will looks like "gcc bar.c foo.o /usr/share/dmd/lib/libphobos2.a"
>
> 2) build with foo.d with "dmd foo.d -lib" which generates proper lib file with all necessary stuff from phobos and whatever.
>
> i specifically choose this order so you can think whats happened.
That works. Thanks!
|
November 24, 2013 Re: Calling D from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to evilrat | On 2013-11-24 08:22, evilrat wrote: > ok i find out what's your problem. here is 2 ways of solving this problem. > > 1) build like you do already but add to gcc call phobos lib, so it will > looks like "gcc bar.c foo.o /usr/share/dmd/lib/libphobos2.a" > > 2) build with foo.d with "dmd foo.d -lib" which generates proper lib > file with all necessary stuff from phobos and whatever. > > i specifically choose this order so you can think whats happened. Compiling with DMD and the -v flag shows a verbose output and exactly how DMD calls GCC to link everything. -- /Jacob Carlborg |
Copyright © 1999-2021 by the D Language Foundation