Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
April 22, 2008 Calling D function from C | ||||
---|---|---|---|---|
| ||||
Is there a way to compile a D object file with some C code? I am looking into creating a PHP extension from D instead of C and as I see it, I would need to be able to create and interface function in C that can call a D function. I tried a simple example of this, but ran into some linking problems. The example follows: ------------- D code ----------------- import std.stdio; extern (C) { void test() { test2(); } } //end extern void test2() { writefln("test"); } ------------- C code ------------------- #include <stdio.h> void test(); int main(int argc, char* argv[]) { test(); return 0; } ------------ Compiled As --------------- /opt/dmd/bin/dmd test.d -c gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm Linker Error... |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | Jonathan Crapuchettes wrote:
> Is there a way to compile a D object file with some C code? I am looking into creating a PHP extension from D instead of C and as I see it, I would need to be able to create and interface function in C that can call a D function.
>
> I tried a simple example of this, but ran into some linking problems. The example follows:
>
> ------------- D code -----------------
> import std.stdio;
>
> extern (C)
> {
> void test()
> {
> test2();
> }
>
> } //end extern
>
> void test2()
> {
> writefln("test");
> }
>
> ------------- C code -------------------
> #include <stdio.h>
>
> void test();
>
> int main(int argc, char* argv[])
> {
> test();
>
> return 0;
> }
>
> ------------ Compiled As ---------------
> /opt/dmd/bin/dmd test.d -c
> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm
> Linker Error...
The code looks ok to me, wath if you compile the c code first and then use dmd to link it (dmd probably uses some linker flags you did not think of)
|
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johan Granberg | On Wed, 23 Apr 2008 07:36:26 +0100, Johan Granberg <lijat.meREM@OVEgmail.com> wrote: > Jonathan Crapuchettes wrote: >> ------------ Compiled As --------------- >> /opt/dmd/bin/dmd test.d -c >> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm >> Linker Error... > > The code looks ok to me, wath if you compile the c code first and then use > dmd to link it (dmd probably uses some linker flags you did not think of) Although in theory both compilers are generating compatible ELF objects I would be wary of mixing compilers this way and much more comfortable using either dmc & dmc or gdc & gcc together. |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | Jonathan Crapuchettes wrote: > Is there a way to compile a D object file with some C code? I am looking into creating a PHP extension from D instead of C and as I see it, I would need to be able to create and interface function in C that can call a D function. You might be able to learn something from looking at PyD. http://pyd.dsource.org/ That aims to let you write Python extensions in D. It works by making shared libs though. That might be the best way. I think that means you would have to use GDC on linux. --bb |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | "Jonathan Crapuchettes" <jcrapuchettes@gmail.com> wrote in message news:fulp5j$19hu$1@digitalmars.com... > /opt/dmd/bin/dmd test.d -c > gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm > Linker Error... What _was_ the linker error? |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | /usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib32/libphobos.a(deh2.o): In function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable': internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9): undefined reference to `_deh_beg' internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe): undefined reference to `_deh_beg' internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14): undefined reference to `_deh_end' internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37): undefined reference to `_deh_end' collect2: ld returned 1 exit status Jarrett Billingsley wrote: > "Jonathan Crapuchettes" <jcrapuchettes@gmail.com> wrote in message news:fulp5j$19hu$1@digitalmars.com... > >> /opt/dmd/bin/dmd test.d -c >> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm >> Linker Error... > > What _was_ the linker error? > > |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bruce Adams | I tried both gdc and dmd for the D code and both had gcc create the same linker errors.
Thanks
JC
Bruce Adams wrote:
> On Wed, 23 Apr 2008 07:36:26 +0100, Johan Granberg <lijat.meREM@OVEgmail.com> wrote:
>
>> Jonathan Crapuchettes wrote:
>
>>> ------------ Compiled As ---------------
>>> /opt/dmd/bin/dmd test.d -c
>>> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm
>>> Linker Error...
>>
>> The code looks ok to me, wath if you compile the c code first and then use
>> dmd to link it (dmd probably uses some linker flags you did not think of)
>
> Although in theory both compilers are generating compatible ELF objects I would be wary of mixing
> compilers this way and much more comfortable using either dmc & dmc or gdc & gcc together.
|
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | Reply to Jonathan: I investigated this problem some days ago to find a way for such callbacks from C code to D code. See the attached files cexception.c and dexception.d. Build the executable (Windows & DMD 1.028 or DMD 2.012 & DM 8.50) via sc -c cexcexption.c dmd -c dexception.d link cexcexption.obj+dexcexption.obj, dcexception.exe Good luck Sivo. Jonathan Crapuchettes Wrote: > Is there a way to compile a D object file with some C code? I am looking into creating a PHP extension from D instead of C and as I see it, I would need to be able to create and interface function in C that can call a D function. > > I tried a simple example of this, but ran into some linking problems. The example follows: > > ------------- D code ----------------- > import std.stdio; > > extern (C) > { > void test() > { > test2(); > } > > } //end extern > > void test2() > { > writefln("test"); > } > > ------------- C code ------------------- > #include <stdio.h> > > void test(); > > int main(int argc, char* argv[]) > { > test(); > > return 0; > } > > ------------ Compiled As --------------- > /opt/dmd/bin/dmd test.d -c > gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm > Linker Error... |
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | Jonathan Crapuchettes wrote:
> /usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib32/libphobos.a(deh2.o): In function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9): undefined reference to `_deh_beg'
> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe): undefined reference to `_deh_beg'
> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14): undefined reference to `_deh_end'
> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37): undefined reference to `_deh_end'
> collect2: ld returned 1 exit status
>
> Jarrett Billingsley wrote:
>
>> "Jonathan Crapuchettes" <jcrapuchettes@gmail.com> wrote in message news:fulp5j$19hu$1@digitalmars.com...
>>
>>> /opt/dmd/bin/dmd test.d -c
>>> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm
>>> Linker Error...
>>
>>
>> What _was_ the linker error?
>>
`_deh_beg' & `_deh_end' (or should that be da_beg & da_end) are IIRC part of the runtime. Try deleting all the .o files and then running it the other way (gcc -c main.c; dmd test.d main.o) dmd sometimes has issues with stuff if you compile piecemeal. There might be other ways to fix this but I don't recall the details.
|
April 23, 2008 Re: Calling D function from C | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | I got the same errors doing you suggestion. Thanks, JC gcc -c main.c -m32 jonathan@blackbeard:~/workspace/c/ctodTest$ /opt/dmd/bin/dmd test.d main.o gcc test.o main.o -o test -m32 -Xlinker -L/opt/dmd/bin/../lib -lphobos -lpthread -lm Errors... BCS wrote: > Jonathan Crapuchettes wrote: >> /usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib32/libphobos.a(deh2.o): In function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable': >> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9): undefined reference to `_deh_beg' >> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe): undefined reference to `_deh_beg' >> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14): undefined reference to `_deh_end' >> internal/deh2.d:(.text._D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37): undefined reference to `_deh_end' >> collect2: ld returned 1 exit status >> >> Jarrett Billingsley wrote: >> >>> "Jonathan Crapuchettes" <jcrapuchettes@gmail.com> wrote in message news:fulp5j$19hu$1@digitalmars.com... >>> >>>> /opt/dmd/bin/dmd test.d -c >>>> gcc main.c test.o -m32 -o tester -lphobos -lpthread -lm >>>> Linker Error... >>> >>> >>> What _was_ the linker error? >>> > > `_deh_beg' & `_deh_end' (or should that be da_beg & da_end) are IIRC part of the runtime. Try deleting all the .o files and then running it the other way (gcc -c main.c; dmd test.d main.o) dmd sometimes has issues with stuff if you compile piecemeal. There might be other ways to fix this but I don't recall the details. |
Copyright © 1999-2021 by the D Language Foundation