www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 22323] New: Link error for virtual destructor of C++ class in

https://issues.dlang.org/show_bug.cgi?id=22323

          Issue ID: 22323
           Summary: Link error for virtual destructor of C++ class in DLL
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: tim.dlang t-online.de

A C++ class with virtual destructor in a DLL can't be used from D, because a
symbol is not found during linking.

/////////////// testdestructor.d /////////////////

extern(C++) class C
{
    ~this();
}

void main()
{
    C o = new C;
}

///////////// testdestructorcpp.cpp //////////////

class __declspec(dllexport) C
{
public:
    virtual ~C();
};

C::~C()
{

}

//////////////////////////////////////////////////

First I'm compiling a DLL from the C++ file:
cl /LD /nologo testdestructorcpp.cpp

Then I try to compile the D program using the DLL, which fails to link:
dmd -m64 testdestructor.d testdestructorcpp.lib
testdestructor.obj : error LNK2001: unresolved external symbol "public: virtual
void * __cdecl C::`scalar deleting destructor'(unsigned int)"
(??_GC  UEAAPEAXI Z)
testdestructor.exe : fatal error LNK1120: 1 unresolved externals
Error: linker exited with status 1120

It works using static linking.

In the forum I found a description of the same problem:
https://forum.dlang.org/thread/ijamdvhliodezmubgaxf forum.dlang.org

--
Sep 19 2021