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