作为背景,我遇到了将一个中型 Linux 代码库(编译成一个巨大的 .so)移植到 x64 窗口(编译成一个 .dll)的过程。我遇到了链接器问题。
作为最小测试用例,如果我仅从以下文件创建一个 Visual Studio 项目:
#include <Windows.h>
#include <Dbghelp.h>
void do_stuff(char const * s)
{
char buffer[4096];
long int len = UnDecorateSymbolName(
s,
buffer,
sizeof(buffer),
UNDNAME_COMPLETE);
}
然后我将项目类型设置为 DLL 并构建它,我收到错误“LNK2001:未解析的外部符号 __imp_UnDecorateSymbolName”。也就是说,文件编译正确,但无法链接到 dll。
我认为我的目标是让我的 dll 链接到 dbghelp.dll,特别是因为(至少在我的系统上)没有像 dbghelp.lib 这样的文件。那么,为什么它现在尝试解析该符号,而不是在我的 DLL 加载到应用程序中时才尝试解析该符号?为什么它无论如何都看不到该功能?
明确地说,我已经确认我正在构建 x64 DLL,并且 C:\Windows\System32 中的 dbghelp.dll 是 x64。
最佳答案
链接到共享库,Windows 中的 DLL,需要以下内容:
- 编译时的头文件:
Dbghelp.h
。 - 链接时的导入库:
Dbghelp.lib
。 - 运行时的 DLL:
Dbghelp.dll
。
您显然有 1 和 3 而缺少 2。Visual Studio 附带的 Windows SDK 包括导入库。但是您需要将它作为附加依赖项添加到项目的链接器选项中。
像这样:
关于windows - DLL 中 Unresolved 符号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522834/