我有一个项目(创建一个dll),比如说test.dll,我没有在dll中输出类的构造函数和析构函数,比如TestClass。这是因为我有一些工厂函数应该被调用来创建和销毁TestClass的对象。这个设计在我创建的独立示例中完全正常,我尝试使用test.dll中的TestClass对象。
然而,当我将这个test.dll(或者我的情况下的.lib,因为我使用Visual Studio)链接到我们的生产模块中的项目时,我得到奇怪的链接错误指向它找不到的构造函数和析构函数对于TestClass。我知道我不会调用new / delete,或者在项目的任何地方创建任何TestClass的堆栈实例。我认为生产模块使用C#/ CLR / CLI和C ++。解决方法的唯一方法是为我导出TestClass的构造函数和析构函数。这在设计上是不可取的。
这种情况对任何人都熟悉吗?有人可以指出可能存在的问题吗?
这是我得到的错误:
Error 5264 error LNK2028: unresolved token (0A000BA3) "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) referenced in function "public: virtual void * __thiscall BE::TestClass::`vector deleting destructor'(unsigned int)" (??_ETestClass@BE@@$$FUAEPAXI@Z) AMBestDetailBridge.obj BEBase
Error 5373 error LNK2001: unresolved external symbol "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) AMBestDetailBridge.obj BEBase
谢谢!
答案 0 :(得分:1)
链接错误表示您通过delete []调用析构函数,因此很可能在生产模块中,您有某些代码:
TestClass* pTest = ...
delete pTest;
TestClass* pTestArray = ...
delete[] pTest;
当然,在智能指针的情况下,它可能并不那么明显:
SmartPtr<TestClass> spTest = ...
// delete called automatically when out of scope.
在一个模块中分配并在另一个模块中删除会使自己面临潜在的风险 - 因为2个模块可能使用不同的堆进行内存分配(比如重新定义新的运算符),幸运的是这个问题在链接时暴露出来,而不是运行时间。