【问题标题】:Unresolved symbol errors within DLLDLL 中未解决的符号错误
【发布时间】:2012-03-20 08:07:41
【问题描述】:

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

【问题讨论】:

  • 仍需与导入库dbghelp.lib链接;这应该包含在 Visual Studio、Platform SDK 等中。

标签: windows linker dbghelp


【解决方案1】:

链接到共享库(Windows 语言中的 DLL)需要以下内容:

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

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

像这样:

【讨论】:

  • 就是这样。我的 windows-search-fu 很弱,我的系统确实有 dbghelp.lib。将它添加到依赖项就像一个魅力。
  • Dbghelp 是 Windows 中比较神秘的库之一。已经发布了大量不同的版本,其中许多版本是随操作系统带外发布的。很容易陷入这样一种情况,即您正在调用存在于您的开发机器上但不存在于普通目标机器上的函数。小心点!
  • 或者你可以#pragma comment(lib, "dbghelp.lib")
  • 我特别喜欢@IonTodirel 的评论
猜你喜欢
  • 2018-11-25
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2011-09-03
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多