【问题标题】:Static data in DLLDLL 中的静态数据
【发布时间】:2013-01-31 14:02:26
【问题描述】:

我的问题与this one 非常相似:DLL 中的类有一个静态成员。在这种情况下,静态成员是类型QString(QT 类型)并为类提供名称。我提供类级别的正常导出:__declspec(dllexport)

当我将 DLL 与我的类链接到另一个项目并尝试编译它时,我收到静态数据的“未解析的外部符号”错误。我验证了两件事:

  1. Dumpbin肯定会报告编译后的DLL要导出的静态数据成员。
  2. 实际上,报错的应用程序中似乎没有使用静态数据成员。

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,它的所有成员函数和静态数据成员都被导出。”

标签: c++ windows dll linker


【解决方案1】:

在您的应用程序头文件中,您需要做两件事。

  1. 导出时,声明定义__declspec(dllexport)
  2. 导入时,声明定义__declspec(dllimport)

你显然不能同时做这两件事。

你要做的就是定义一个这样的宏:

#ifdef __COMPILING_MYLIB
#define MYLIBAPI __declspec(dllimport)
#else
#define MYLIBAPI __declspec(dllexport)
#endif

然后像这样声明您的导出:

// mylib.h
class MYLIBAPI MyClass {
public: 
   virtual ~MyClass();
   static const QString JUST_A_NAME;    
};

然后,在编译 MYLIB 时,将-D__COMPLING_MYLIB 传递给编译器,这会触发上面的#if

这样,当编译库本身时,头文件将事物声明为导出,但在编译将使用库的事物时,它们被声明为导入。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多