C++ Visual Studio,使用 .lib 文件无法解析的外部符号

use*_*869 1 c++ linker shared-libraries visual-studio

我继承了一个遗留项目,它利用 *.lib 中的一些外部函数。据我所知,使用 *.lib 的语法是正确的,并且可以在他们使用的任何 Visual Studio 版本中构建。(即有一个extern“C”原型文件,并且所有函数签名都是正确的)。

构建时,我收到“错误 LNK2019:函数中引用的无法解析的外部符号 _A86_ReadConfigReg@12”

我非常有信心这与 *.lib 文件有关,因为 *.lib 文件的名称中包含“A86”...还有一个同名的 *.dll。

我转到项目属性 -> 链接器 -> 输入并在“其他依赖项”中列出 *.lib 文件名,但没有运气。我尝试添加包含目录,将 *.lib 和 *.dll 复制到可执行位置。但没有运气。

我该如何修复这个错误?

Mic*_*Roy 5

您应该做的第一件事是检查库以确保引用的函数在那里。启动 msvc 开发人员命令提示符,然后运行 ​​dumpbin.exe

句法:

dumpbin /exports <full path library name>
Run Code Online (Sandbox Code Playgroud)

这将为您提供从库中导出的所有符号的列表。

从那里你会更清楚地知道该做什么。

[编辑]

dumpbin 告诉您,您的 lib 导出一个名为 的函数A86_ReadConfigReg,该函数是 __cdecl 签名,而不是链接器期望的 __stdcall 签名_A86_ReadConfigReg@12......至少有两件事您应该按优先级顺序执行/检查。

  1. 您的链接器正在寻找 pascal 调用签名,这很奇怪。您的项目是否将 __stdcall 作为函数调用的默认值?这是由 中的 /Gz 开关控制的Project Properties->C/C++->Advanced->Calling Convention。默认值应设置为 __cdecl (/Gd)

  2. 您应该检查您的包含文件是否将所有函数声明包含在一个extern "C" { }块中。如果没有,您可以将该块放置在 #include 指令周围,这样您就不必修改库的文件。

就像这样:

extern "C" {
#include <mylib.h>
}
Run Code Online (Sandbox Code Playgroud)