On 2016-09-27 01:32, Walter Bright wrote:
Linking C libraries and object code into D programs has always worked easily in D. The other way around, not so well.Consider the following C program: ---- main.c ---- extern int foo(); void main(int argc, char* argv[]) { foo(); } ---- foo.c ---- int foo() { return 7; } --------------- Compile/link in the usual way: gcc main.c -c gcc foo.c -c gcc main.o foo.o No problem. Now replace foo.c with foo.d: ---- foo.d ---- extern (C) int foo() { return 7; } --------------- Compile/link with: gcc main.c -c dmd foo.d -c gcc main.o foo.o Produces: bar.o:(.eh_frame+0x13): undefined reference to `__dmd_personality_v0' bar.o: In function `_D3bar7__arrayZ': bar.d:(.text._D3bar7__arrayZ+0x21): undefined reference to `_d_arraybounds' bar.o: In function `_D3bar8__assertFiZv': bar.d:(.text._D3bar8__assertFiZv+0x21): undefined reference to `_d_assert' bar.o: In function `_D3bar15__unittest_failFiZv': bar.d:(.text._D3bar15__unittest_failFiZv+0x21): undefined reference to `_d_unittest' bar.o: In function `__d_dso_init': bar.d:(.text.d_dso_init[.data.d_dso_rec]+0x28): undefined reference to `_d_dso_registry' collect2: error: ld returned 1 exit status How much of an issue is this with D? Is it something we need to address?
I don't see how that can be expected to work. You're not linking druntime. The easiest is to link with DMD instead of GCC. An alternative is to compile the D code with -betterC to avoid the runtime (not sure what happens with the personality function), although that's currently broken [1].
[1] https://issues.dlang.org/show_bug.cgi?id=16547 -- /Jacob Carlborg
