Linker error: Symbol Undefined

Brad Roberts braddr at puremagic.com
Fri Oct 11 14:16:31 PDT 2013


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.



More information about the Digitalmars-d-learn mailing list