相关疑难解决方法(0)

DLL和完全专业化的模板类

环境:Visual Studio 9,没有托管扩展的C++.

我有一个第三方库,它导出MyClass<42>MyClass.h中定义的完全专用的模板类.它被编译成辅助加载器.lib和.dll文件..lib文件包含此特化的编译代码和必要的符号.MyClass.h看起来像这样:

template<UInt D>
class MyClass {
public:
    MyClass() {...};
    virtual ~MyClass() {};
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用这个库.如果我在Client.cpp中包含MyClass.h然后编译它,我将在Client.obj文件中获得这些符号的第二个副本.我可以通过将该专业化的所有成员定义为"extern"来摆脱这些符号.我的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) {...}
Run Code Online (Sandbox Code Playgroud)

问题是我无法以这种方式摆脱虚拟析构函数.对于虚拟析构函数,我得到一个几乎标准的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
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

c++ linker templates visual-studio

8
推荐指数
1
解决办法
1748
查看次数

__declspec(dllexport)在导入函数之前添加它时做了什么

可能重复:
Windows和C++:extern&__ declspec(dllimport)
为什么/何时不需要__declspec(dllimport)?

我想写一个DLL项目.该项目包括几个DLL.他们是依赖的.我定义了一些宏如下:

#ifdef  MYDLL_DECL1
    #define  DLL_DECL __declspec(dllexport)
#else
    #define DLL_DECL __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

我为每个模块定义了MYDLL_DECL1 ... MYDLL_DECLn .因为我认为如果我定义相同的宏,它将无法正常工作.但我真的只想定义一个宏,我写了一个测试平台.我有两个模块.在第二个moudle的源文件中.我写代码如下:

#define  MYDLL_DECL
#include "moudle1.h"
#include "moudle2.h"
Run Code Online (Sandbox Code Playgroud)

如果我使用相同的宏名称"MYDLL_DECL",对于modle1的头文件,我已经定义了"MYDLL_DECL",因此"DLL_DECL"等于'__declspec(dllexport)'.实际上在module2中它应该等于"__declspec(dllimport)",因为module2导入module1. 但是当我为两个模块定义一个相同的宏时,我发现它有效.我还发现OpenCV也将这种方法用于其库

c c++ dll opencv

5
推荐指数
1
解决办法
3815
查看次数

0
推荐指数
1
解决办法
1654
查看次数

标签 统计

c++ ×3

c ×2

visual-studio ×2

dll ×1

linker ×1

opencv ×1

templates ×1

windows ×1