gcc linkage problem with C & D

Frits van Bommel fvbommel at REMwOVExCAPSs.nl
Fri Jul 27 00:06:28 PDT 2007

Charles D Hixson wrote:
> /usr/local/dmd/lib/libphobos.a(dmain2.o): In function `main':
> internal/dmain2.d:(.gnu.linkonce.tmain+0x74): undefined reference to 
> `_Dmain'
> internal/dmain2.d:(.gnu.linkonce.tmain+0xc5): undefined reference to 
> `_Dmain'
> /usr/local/dmd/lib/libphobos.a(deh2.o): In function 
> `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9): 
> undefined reference to `_deh_beg'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe): 
> undefined reference to `_deh_beg'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14): 
> undefined reference to `_deh_end'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37): 
> undefined reference to `_deh_end'
> collect2: ld returned 1 exit status
> make: *** [test0] Error 1
[snip makefile]
> (minus some wrapping that happened in posting).  The other files are 
> unchanged:  test0c.c is a "hello, world" function, and test0d.d is a 
> main routine that just calls the function.

I just had another look at your test0d.d file, and found your problem. 
Your file is this:
     int    test();

void    main()
{    test;    }
That little ':' at the end of the first line means it'll apply extern(C) 
to _everything that follows_, not just test(). So your main() is also 
extern(C), which changes the name in the object file and doesn't invoke 
DMDs special handling of the D main function (which emits _deh_* to help 
exception handling support locate exception handler data).

So to fix your program, just delete the ':'. It compiled and ran fine on 
my machine after that modification (besides some minor issues you 
probably won't have; using a 32-bit gcc on my 64-bit machine and 
correcting the dmd dir in the makefile for my machine).

More information about the Digitalmars-d-learn mailing list