【发布时间】:2013-01-31 14:02:26
【问题描述】:
我的问题与this one 非常相似:DLL 中的类有一个静态成员。在这种情况下,静态成员是类型QString(QT 类型)并为类提供名称。我提供类级别的正常导出:__declspec(dllexport)。
当我将 DLL 与我的类链接到另一个项目并尝试编译它时,我收到静态数据的“未解析的外部符号”错误。我验证了两件事:
- Dumpbin肯定会报告编译后的DLL要导出的静态数据成员。
- 实际上,报错的应用程序中似乎没有使用静态数据成员。
DLL 中的 HEADER 文件 (.h) 为:
class __declspec(dllexport) MyClass {
public:
virtual ~MyClass();
static const QString JUST_A_NAME;
};
DLL 中的实现文件 (.cpp) 为:
#include "MyClass.h"
MyClass::~MyClass() { }
const QString MyClass::JUST_A_NAME("call_me_al");
与 already mentioned post 相比,我避免使用内联方法,例如实现显然不在标题中。类型,QString(见第 83 行 ff.),本身包含几个内联。这会导致错误吗?
编辑:我在我的应用程序的标题中添加了一个导入语句。它位于任何包含之前。 APPLICATION 中的 HEADER 文件 (.h) 为:
class __declspec(dllimport) MyClass {
public:
virtual ~MyClass();
static const QString JUST_A_NAME;
};
错误依旧:
error LNK2001: non resolved external symbol ""public: static class QString const MyClass::JUST_A_NAME" (?JUST_A_NAME@MyClass@@2VQString@@B)". <name of .obj file from application>
【问题讨论】:
-
我希望您的未解析符号是
MyClass::JUST_A_NAME,因为该成员不存在于应用程序中。但这不是问题的根源!您需要在使用应用程序中__declspec(dllimport)!我认为这足以让编译器确定您要使用 DLL 中的导出成员。 -
我要检查的第一件事是“依赖”(www.dependencywalker.com),该符号是否实际上在 DLL 中。然后,正如 MFH 正确指出的那样,您必须在导入和导出之间切换,这在您自己提供的链接中进行了说明。然后,但这只是模糊的记忆,我似乎记得即使一个类通常是导出的,它的静态部分也不是,所以你必须显式地将导入/导出添加到它的声明中。
-
是的,MFH,您对未解决错误的猜测是正确的(请参阅EDIT)。根据您的建议,我添加了一个
__declspec(dllimport),到目前为止还没有成功。 doomster,正如问题中提到的,我已经用 dumpbin 验证了丢失的符号肯定会导出到 DLL 中。 Microsoft 说 “[正在做] 一个类 dllexport,它的所有成员函数和静态数据成员都被导出。”