digitalmars.D.learn - Calling D function from C
- Jonathan Crapuchettes (30/30) Apr 22 2008 Is there a way to compile a D object file with some C code? I am looking...
- Johan Granberg (3/44) Apr 22 2008 The code looks ok to me, wath if you compile the c code first and then u...
- Bruce Adams (6/14) Apr 23 2008 Although in theory both compilers are generating compatible ELF objects ...
- Jonathan Crapuchettes (5/23) Apr 23 2008 I tried both gdc and dmd for the D code and both had gcc create the same...
- Bill Baxter (7/11) Apr 23 2008 You might be able to learn something from looking at PyD.
- Jarrett Billingsley (3/6) Apr 23 2008 What _was_ the linker error?
- Jonathan Crapuchettes (12/22) Apr 23 2008 /usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib32/libphobos.a(deh2.o...
- BCS (6/30) Apr 23 2008 `_deh_beg' & `_deh_end' (or should that be da_beg & da_end) are IIRC
- Jonathan Crapuchettes (8/39) Apr 23 2008 I got the same errors doing you suggestion.
- Jonathan Crapuchettes (6/37) Apr 23 2008 I just tried the following and it worked.
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...
Apr 22 2008
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)
Apr 22 2008
On Wed, 23 Apr 2008 07:36:26 +0100, Johan Granberg <lijat.meREM OVEgmail.com> wrote:Jonathan Crapuchettes wrote: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.------------ 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)
Apr 23 2008
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: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.------------ 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)
Apr 23 2008
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
Apr 23 2008
"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?
Apr 23 2008
/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?
Apr 23 2008
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:`_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."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?
Apr 23 2008
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:`_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."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?
Apr 23 2008
I just tried the following and it worked. gcc -c main.c gdmd test.d main.o Thanks for everyones help! JC 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:`_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."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?
Apr 23 2008