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”。该宏会搞乱您的类声明。