【问题标题】:C++ dllimport: unresolved externals with static fieldsC ++ dllimport:具有静态字段的未解析外部
【发布时间】:2015-09-26 22:48:20
【问题描述】:

我有一个包含主程序和 DLL 模块的 Visual Studio C++ 项目。 DLL 有一个具有以下定义的类:

// .h
#ifdef _USRDLL
    #define DLLAPI __declspec(dllexport)
#else
    #define DLLAPI __declspec(dllimport)
#endif

class DLLAPI EClass
{
public:
    static int value;

    static int get_value();
};

// .cpp
int EClass::value = 1;

int EClass::get_value()
{
    return value;
}

DLL 项目编译成功,两个符号(value 和 get_value)都可以被 Dependency Walker 观察到。

在主程序中可以调用静态函数get_value

int v = EClass::get_value();  // Ok, v = 1

但是当我尝试直接访问 value 字段时

int v = EClass::value;  // Error

我收到一个错误

LNK2001 unresolved external symbol "public: static int EClass::value" (?value@EClass@@2HA)

可以避免对静态字段使用访问器吗?

【问题讨论】:

  • 看起来您没有导出静态,您是否尝试在其声明之前添加DLLAPI? (课外)
  • 可能还需要添加到标题中:extern DLLAPI int EClass::value; 告诉您的应用使用 dll 导入它。
  • 是的,我试过了,没有成功。静态字段已正确导出:我可以使用访问器方法访问它,并且在 DLL 中看到此字段。
  • @AndreyNasonov 您是否使用其他 dll 中的 dll?如果是这样,您使用 _USRDLL 宏而不是每个 dll 的唯一宏可能会导致问题,无论如何,对于单个 dll 和使用它的单个 exe,它适用于我,而我的 Visual Studio 10 Express 没有任何变化。

标签: c++ visual-c++ dllimport dllexport


【解决方案1】:

_USRDLL 只能在 DLL 项目中定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多