Windows DLL中未解决的符号错误

Windows DLL中未解决的符号错误,windows,linker,dbghelp,Windows,Linker,Dbghelp,作为背景,我遇到过这样一种情况:将一个中等大小的linux代码库(编译成一个巨大的.so)移植到x64 windows(编译成一个.dll)。我的链接器有问题 作为最低限度的测试用例,如果我仅从以下文件创建Visual Studio项目: #include <Windows.h> #include <Dbghelp.h> void do_stuff(char const * s) { char buffer[4096]; long int len = UnDec

作为背景,我遇到过这样一种情况:将一个中等大小的linux代码库(编译成一个巨大的.so)移植到x64 windows(编译成一个.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);
}
#包括
#包括
void do_stuff(字符常量*s)
{
字符缓冲区[4096];
long int len=UndercorateSymbolName(
s
缓冲器
sizeof(缓冲区),
UND名称(完整);
}
我将项目类型设置为DLL并构建它,得到一个错误“LNK2001:Unresolved external symbol uu imp_UndercorateSymbolName”。也就是说,文件可以正确编译,但无法链接到dll

我认为我的dll的目标是链接到dbghelp.dll,特别是因为(至少在我的系统上)没有dbghelp.lib这样的文件。那么,为什么它现在要解析那个符号,而不是当我的DLL加载到应用程序中时?为什么它看不到这个函数呢


为了清楚起见,我已经确认我正在构建x64 DLL,并且C:\Windows\System32中的dbghelp.DLL是x64。

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

  • 编译时的头文件:
    Dbghelp.h
  • 链接时的导入库:
    Dbghelp.lib
  • 运行时的DLL:
    Dbghelp.DLL
  • 很明显,您有1和3,但缺少2。VisualStudio附带的Windows SDK包括导入库。但您需要将其作为附加依赖项添加到项目的链接器选项中

    像这样:


    它仍然需要与导入库dbghelp.lib链接;这应该包括在VisualStudio、平台SDK等中。我的windows搜索引擎很弱,我的系统有dbghelp.lib。将它添加到依赖项中非常有效。Dbghelp是Windows中比较神秘的库之一。已经发布了大量不同的版本,其中许多版本是随操作系统带外发布的。很容易出现这样的情况,即您调用的函数出现在您的开发机器上,但在普通的目标机器上却不存在。小心点!或者你可以#pragma comment(lib,“dbghelp.lib”),我特别喜欢@IonTodirel comment