9

作为背景,我遇到了将中型 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。

4

1 回答 1

17

链接到共享库、Windows 中的 DLL 需要以下内容:

  1. 编译时的头文件:Dbghelp.h.
  2. 链接时的导入库:Dbghelp.lib.
  3. 运行时的 DLL:Dbghelp.dll.

您显然有 1 和 3 并且缺少 2。Visual Studio 附带的 Windows SDK 包括导入库。但是您需要将其作为附加依赖项添加到项目的链接器选项中。

像这样:

在此处输入图像描述

于 2012-03-01T20:30:12.080 回答