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