环境: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)
我该怎么办?
可能重复:
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 文件或 .cpp 文件中编译时,两种符号之间会有什么区别吗?