C++ C++;链接未解析外部的DLL
我有一个相当大的C++ C++;链接未解析外部的DLL,c++,dllexport,C++,Dllexport,我有一个相当大的Core项目,我正在使用我构建的DLL引擎对其进行调整,我遇到了一系列错误,如: 未解析的外部符号“private:静态类” 当在DLL中包含来自内核的一些头时,该类将通过_declspec(dllexport)导出,但是任何包含静态成员的头都会抛出大量关于静态成员的错误 这是一个相当大的项目,我不能完全删除我看到的所有静态类成员,这类事情是否存在 正在导入的类的基本示例: class __declspec(dllexport) MyClass { public:
Core
项目,我正在使用我构建的DLL引擎对其进行调整,我遇到了一系列错误,如:
未解析的外部符号“private:静态类”
当在DLL中包含来自内核的一些头时,该类将通过_declspec(dllexport)导出,但是任何包含静态成员的头都会抛出大量关于静态成员的错误
这是一个相当大的项目,我不能完全删除我看到的所有静态类成员,这类事情是否存在
正在导入的类的基本示例:
class __declspec(dllexport) MyClass
{
public:
static bool m_someVar;
}
为清楚起见,我只想指出,m_someVar是在类实现文件中定义/声明的(忘记术语)可能是个愚蠢的问题,但您是否在某处定义了它?您的定义类似于:
bool MyClass::m_someVar = false;
使用代码段并在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
这可能会有一些副作用:)当您编译
核心时,您希望这些函数是dllexport
;但是,当您编译DLL时,您希望它们是dllimport
。在您的情况下,您总是将它们定义为dllexport
,因此当您链接DLL时,它会抱怨您已声明一个从未定义过的函数(甚至说你会导出它)
解决方案很简单。不必手动\u declspec
ing,而是根据您是核心
还是DLL来创建宏:
#ifndef I_AM_A_DLL
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllimport)
#define IMPORT __declspec(dllexport)
#endif
对于核心
中的功能,请使用导出
;对于外部DLL中的功能,请使用导入
:
class EXPORT MyClass
{
public:
static bool m_someVar;
}
你能告诉我们确切的错误,最好是一些相应的代码吗?我添加了一个基本类示例,错误代码基本相同:5>MyFile.obj:error LNK2001:unresolved外部符号“private:static unsigned char MyClass::m_someVar”(?m_someVare@MyClass@@0EA)(根据上述示例进行修正)我不太清楚我是否理解,我的项目中使用的宏基本上是一些DLL_U导出uu declspec(dllexport)@undowned:不,它是目标项目中使用的宏。请在其中一个头文件中查找“#define bool unsigned char”。该宏会搞乱您的类声明。