我正在处理一个使用 Visual Studio 2008 构建的 C++ 项目。 我正在定义(在一个生成 dll 的项目中)一个模板类和一个派生的非模板类:
template <class T>
struct DLL_EXPORT Base {
int base() { return 1; }
};
struct DLL_EXPORT Deriv: public Base<Deriv> {
int deriv() { return 1; }
};
DLL_EXPORT
是常见的东西:
#ifdef COMPILING_MY_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
现在,当我尝试在另一个项目中使用我的 Deriv
类时,麻烦就来了。如果我只使用 Deriv
中的函数,它运行良好:
Deriv d;
d.deriv();
但是如果我尝试调用 d.base()
,我会收到以下链接器错误:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall Base<struct Deriv>::base(void)" (__imp_?base@?$Base@UDeriv@@@@QAEHXZ)
如果在我的 dll 代码的其他地方,我正在使用 d.base() 函数,它运行良好,并且链接器错误在“用户”项目中消失。如果我删除模板部分(它在我的示例中并不是很有用,但在现实生活中它很有用),一切都很好。
如果函数未被使用或类似的东西,它看起来就不会被编译。有什么想法吗?
提前致谢。
最佳答案
不要在模板定义上使用 __declspec(dllexport),因为它们不会被导出(它们在实例化之前不是真正的代码)。 它们仅在头文件中供源使用。您可以对模板的特化使用 __declspec(dllexport),但您必须在 DLL 中至少实例化一次。
关于类扩展模板类的 C++ 符号导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380326/