Linker error: Symbol Undefined

Elvis Zhou elvis.x.zhou at gmail.com
Sun Oct 13 05:26:18 PDT 2013


On Friday, 11 October 2013 at 22:33:31 UTC, Namespace wrote:
> On Friday, 11 October 2013 at 21:16:38 UTC, Brad Roberts wrote:
>> It's due to having the destructor versioned out when building 
>> foo and visible when building bar. When brought together, 
>> you've created an incompatible whole.  There's no destructor 
>> actually included in foo's .o file that you told it it could 
>> expect to find.
>>
>> There's no bug in the compiler or linker, just your usage of 
>> mis-matched code.
>>
>> On 10/11/13 11:39 AM, Namespace wrote:
>>> Hey, I'm curious about this linker error:
>>>
>>> OPTLINK (R) for Win32  Release 8.00.13
>>> Copyright (C) Digital Mars 1989-2010  All rights reserved.
>>> http://www.digitalmars.com/ctg/optlink.html
>>> bar.obj(bar)
>>> Error 42: Symbol Undefined _D3foo1A6__dtorMFZv
>>> --- errorlevel 1
>>>
>>> foo.d:
>>> ----
>>> debug import std.stdio;
>>>
>>> struct A {
>>> public:
>>>    int id;
>>>
>>>    this(int id) {
>>>        debug writeln("CTor A with ", id);
>>>
>>>        this.id = id;
>>>    }
>>>
>>>    debug ~this() {
>>>        writeln("DTor A with ", id);
>>>    }
>>> }
>>> ----
>>>
>>> bar.d
>>> ----
>>> import foo;
>>>
>>> void test(A a) {
>>>    a.id++;
>>> }
>>>
>>> void main() {
>>>    test(A(42));
>>>    A a = A(23);
>>>    test(a);
>>> }
>>> ----
>>>
>>> Usage:
>>>
>>> C:\Users\Besitzer\Desktop>dmd -lib foo.d
>>>
>>> C:\Users\Besitzer\Desktop>dmd bar.d foo.lib -debug
>>> OPTLINK (R) for Win32  Release 8.00.13
>>> Copyright (C) Digital Mars 1989-2010  All rights reserved.
>>> http://www.digitalmars.com/ctg/optlink.html
>>> bar.obj(bar)
>>> Error 42: Symbol Undefined _D3foo1A6__dtorMFZv
>>> --- errorlevel 1
>>>
>>> ====
>>> Without -debug or with 'debug' _in_ the DTor (before writeln) 
>>> instead before the DTor works fine.
>
> Another question: Is there a way that the DTor is only 
> generated if I compile foo with -debug? So that if I compile 
> and link bar.d and foo.lib, even with -debug, but compiled 
> foo.d without, the DTor is automatically generated? Hope that 
> is not to weird. :D

No, you can't. However, you can use other version condition 
instead to avoid debug code.

foo.d:
----
version(TrackDTor){
     import std.stdio;
}

struct A {
public:
    int id;
    this(int id) {
        debug writeln("CTor A with ", id);
        this.id = id;
    }
    version(TrackDTor){
        ~this() {
            writeln("DTor A with ", id);
        }
    }
}

then compile foo.d with -version=TrackDTor


More information about the Digitalmars-d-learn mailing list