类扩展模板类的 C++ 符号导出

标签 c++ templates visual-c++ linker

我正在处理一个使用 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/

相关文章:

django - 比较 Django 模板中的变量

c++ - 如何定义可变参数类模板的成员模板函数

c++ - 如何处理 ATLMFC 包含文件中的指针截断?

visual-studio - Visual C++ Update 2 运行时在哪里

c++ - 是否可以修复 Windows 头文件(winnt.h、windefs.h)以便它们可以用/Za 编译?

C++ 嵌套作用域访问

python - 如何在 Django 中的 HTML 表单上显示表单中的多对多字段

c++ - 我在 OpenGL 中显示图像时遇到问题

c++ - 在 C++ 中设置/获取大量变量的好习惯

c++ - 有没有一种简单的方法可以使用 native C++ 代码(VS2010)和 Bamboo 执行 CI?