我正在使用一个相当大的Core
项目,我正在尝试使用我已经构建的DLL引擎,我遇到了一堆错误:
未解析的外部符号“private:static class
当在DLL中包含Core中的一些头文件时,该类通过__declspec(dllexport)导出,但是任何带有静态成员的头文件都会抛出关于静态成员的大量错误。
这是一个相当大的项目,我无法完全绕过去除我看到的所有静态类成员,无论如何都有这种事情吗?
正在导入的类的基本示例:
class __declspec(dllexport) MyClass
{
public:
static bool m_someVar;
}
为了清楚起见,我只想解决在类实现文件中定义/声明(忘记术语)的m_someVar
答案 0 :(得分:7)
编译Core
时,您希望这些函数为dllexport
;但是,在编译DLL时,您希望它们是dllimport
。在您的情况下,您总是将它们定义为dllexport
,因此当您链接DLL时,它会抱怨您已声明了一个函数(甚至表示您已将其导出),而无需定义它。
解决方案很简单。而不是手动__declspec
,而是根据您是Core
还是DLL来创建宏:
#ifndef I_AM_A_DLL
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllimport)
#define IMPORT __declspec(dllexport)
#endif
对EXPORT
和Core
中的函数使用IMPORT
作为外部DLL中的函数:
class EXPORT MyClass
{
public:
static bool m_someVar;
}
答案 1 :(得分:2)
使用您的代码段并在DLL上运行Dumpbin.exe / exports会产生以下输出:
1 0 0001107D ??4MyClass@@QAEAAV0@ABV0@@Z = @ILT+120(??4MyClass@@QAEAAV0@ABV0@@Z)
2 1 00017000 ?m_someVar@MyClass@@2_NA = ?m_someVar@MyClass@@2_NA (public: static bool MyClass::m_someVar)
请注意静态成员的导出是如何存在的,但与您的名称略有不同。如果我通过undname.exe运行您的导出名称,我得到:
Undecoration of :- "?m_someVare@MyClass@@0EA"
is :- "private: static unsigned char MyClass::m_someVare"
注意区别。你的目标项目中有一个邪恶的宏。通过将此问题添加到头文件来解决您的问题:
#undef bool
这可能会产生一些副作用:)
答案 2 :(得分:0)
也许是一个愚蠢的问题,但你在某个地方定义它吗?您的定义类似于:
bool MyClass::m_someVar = false;