gcc linkage problem with C & D

Charles D Hixson charleshixsn at earthlink.net
Fri Jul 27 00:47:29 PDT 2007

Frits van Bommel wrote:
> 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:
> -----
> extern(C):
>     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).

THANK YOU!!  (Well, I feel stupid, but at least Makefile3 is 
now working.  Presumably I can get the others to work also.)

More information about the Digitalmars-d-learn mailing list