我继承了一个遗留项目,该项目利用* .lib中的一些外部函数。根据我的说法,使用* .lib的语法是正确的 可以在他们使用的任何视觉工作室版本中构建。 (即,有一个extern" C"原型文件,并且所有功能签名都是正确的。)
构建时,我得到"错误LNK2019:未解析的外部符号_A86_ReadConfigReg @ 12在函数中引用..."
我非常确信这与* .lib文件有关,因为* .lib文件有" A86"在名称中......还有一个* .dll具有相同的名称。
我去了项目属性 - >链接器 - >在"附加依赖项"中输入并列出* .lib文件名,但没有运气。我尝试添加include目录,复制* .lib& * .dll到可执行位置。但没有运气。
如何修复此错误?
答案 0 :(得分:0)
您应该做的第一件事是检查库以确保引用的函数在那里。启动msvc开发人员命令提示符,然后运行dumpbin.exe
语法:
dumpbin /exports <full path library name>
这将为您提供库中所有导出符号的列表。
您可以更清楚地了解该怎么做。
<强> [编辑] 强>
dumpbin告诉你,你的lib导出了一个名为A86_ReadConfigReg
的函数,它是一个__cdecl签名,而不是你的链接器所期望的_ {stdcall签名,如_A86_ReadConfigReg@12
....至少应该做两件事/按优先顺序检查。
你的链接器正在寻找一个pascal调用签名,这很奇怪。您的项目是否将__stdcall作为函数调用的默认值?这是由Project Properties->C/C++->Advanced->Calling Convention
中的/ Gz切换控制的。默认值应设置为__cdecl(/ Gd)
您应该检查您的包含文件是否包含extern "C" { }
块中的所有函数声明。如果他们不这样做,您可以将块放在#include指令周围,这样您就不必修改库的文件了。
像这样:
extern "C" {
#include <mylib.h>
}