链接器错误(未解析的符号)与DLL中的模板类

时间:2013-06-05 09:37:45

标签: c++ templates linker-errors explicit-instantiation

当使用DLL(Visual Studio 2008编译器)中的(专用)模板类时,我收到链接器错误 - 未解析的符号。我试图使用Stackoverflow中描述的'显式模板实例化'技巧,但它不起作用。我把它分解成一个非常简单的可重复的例子:

我有一个动态库(DLL)'MyTemplates.lib',带有头文件'MyTemplates.h'(和一个源文件'MyTemplates.cpp',没有任何代码,只包含此头文件),内容如下:

template <class T>
class  A
{
public:
    A()
    { int x = 7; }
 };

template <class T>
class B : public A<T>
{
public:
    B()
    {}
};

// do explicit template instantiation for classes A<int> and B<int>
// macro 'MYTEMPLATES_API' is defined in the usual way as:
//#ifdef MYTEMPLATES_EXPORTS
//  #define MYTEMPLATES_API   __declspec( dllexport ) 
//#else
//  #define MYTEMPLATES_API  __declspec(dllimport) 
//#endif
template class MYTEMPLATES_API A<int>;
template class MYTEMPLATES_API B<int>;

现在我有另一个动态库'UserLibary'(链接'MyTemplates.lib')和文件'Util.h'和Util.cpp'。 'Util.h'文件如下:

#include "MyTemplates.h"

class UserClass
{
public:
    UserClass();
public:
    A<int> bla;
    B<int> blubb;
};

并且'Util.cpp'文件的内容是:

#include "Util.h"

UserClass::UserClass()
{
}

问题是我的库'UserLibrary'确实编译得很好,但是它给出了两个链接器错误,如下所示:

1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall B<int>::B<int>(void)" (__imp_??0?$B@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)
1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall A<int>::A<int>(void)" (__imp_??0?$A@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)

因此,链接器无法找到类A<int>B<int>的默认构造函数的符号。为什么这是可能的,我怎样才能摆脱这些链接器错误?我认为类A<int>B<int>的explict模板实例化(在文件'MyTemplates.h'中)可以解决这个问题,但不幸的是它似乎没有帮助 - 或者我在使用它错误的方法 ?我的编译器是Visual Studio 2008,操作系统是Windows 7 64位,代码是用64位编译的。

1 个答案:

答案 0 :(得分:0)

您的问题描述并未说明您需要拥有该DLL的原因。我会发展 无论如何,当其中的所有内容都是模板时,仅标题库。因此无需导入 或导出,如果你需要它的话,只需#include

相关问题