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.

Reply via email to