环境:Visual Studio 9,C++,无托管扩展。
我有一个第三方库,该库可导出MyClass.h中定义的完全专业的模板类MyClass<42>
。它被编译为辅助加载程序.lib和.dll文件。 .lib文件包含此专业的编译代码和必要的符号。 MyClass.h看起来像这样:
template<UInt D>
class MyClass {
public:
MyClass() {...};
virtual ~MyClass() {};
}
现在,我想使用这个库。如果将MyClass.h包含在Client.cpp中,然后对其进行编译,则将在Client.obj文件中获得这些符号的第二个副本。我可以通过将该专业的所有成员定义为“外部”来摆脱这些符号。我的Client.cpp看起来像这样:
#include <ThirdParty/MyClass.h>
extern template class MyClass<42>;
extern template MyClass<42>::MyClass<42>();
extern template MyClass<42>::~MyClass<42>();
void MyFunction(MyClass<42>& obj) {...}
问题是我无法以这种方式摆脱虚拟析构函数。对于虚拟析构函数,我得到一个几乎标准的LNK2005错误:
ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005:
"public: virtual __thiscall MyClass<42>::~MyClass<42>(void)"
(??1?$MyClass@$01@@@UAE@XZ) already defined in Client.obj
我应该怎么办?
最佳答案
似乎对于虚拟方法,必须同时将它们定义为extern
和__declspec(dllimport)
:
extern template __declspec(dllimport) MyClass<42>::~MyClass<42>();
这使我的链接器很高兴可以正确地链接我的代码。
如果某些专家描述了原因,或者至少指向一些解释这种情况的文章,我将感到非常高兴。