【发布时间】: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