【发布时间】:2026-02-20 13:45:01
【问题描述】:
我有一个 DLL,其中包含一个带有静态成员的类。我使用__declspec(dllexport) 是为了利用这个类的方法。但是当我将它链接到另一个项目并尝试编译它时,我得到静态数据的“未解析的外部符号”错误。
例如 在 DLL 中,Test.h
class __declspec(dllexport) Test{
protected:
static int d;
public:
static void m(){int x = a;}
}
在 DLL 中,Test.cpp
#include "Test.h"
int Test::d;
在使用 Test 的应用程序中,我调用 m()。
我还尝试对每个方法分别使用 __declspec(dllexport),但静态成员仍然出现相同的链接错误。
如果我使用 dumpbin 检查 DLL(.lib),我可以看到符号已被导出。
例如,应用程序在链接时给出以下错误:
1>Main.obj : error LNK2001: unresolved external symbol "protected: static int CalcEngine::i_MatrixRow" (?i_MatrixRow@CalcEngine@@1HA)
但是.lib的dumpbin包含:
Version : 0
Machine : 14C (x86)
TimeDateStamp: 4BA3611A Fri Mar 19 17:03:46 2010
SizeOfData : 0000002C
DLL name : CalcEngine.dll
Symbol name : ?i_MatrixRow@CalcEngine@@1HA (protected: static int CalcEngine::i_MatrixRow)
Type : data
Name type : name
Hint : 31
Name : ?i_MatrixRow@CalcEngine@@1HA
我不知道如何解决这个问题。我究竟做错了什么?我该如何克服这些错误?
附:该代码最初是为 Linux 开发的,.so/binary 组合可以正常工作
编辑:在给定的情况下,应用程序不直接引用静态变量,但该方法是内联的,因为它位于标头中。我能够通过将方法移动到 .cpp 文件来解决链接错误。
【问题讨论】:
-
我的第一反应是责备名称损坏,但是从检查垃圾箱来看,似乎损坏的名称匹配。只是为了确定,您是否使用相同的编译器版本编译两者?
-
是的。我不确定编译器版本,但我使用 Visual C++ 2008 Express 编译 DLL 和应用程序
标签: c++ windows linker-errors dllexport