2017-07-19 63 views
0

我已经继承了一个遗留项目,它利用* .lib中的一些外部函数。据我所知,使用* .lib的语法是正确的,并且这个 可以在他们使用的任何visual studio版本中构建。 (即,有一个外部“C”原型文件,并且所有功能签名都是正确的)。C++ visual studio,使用.lib文件的无法解析的外部符号

建设的时候,我得到“错误LNK2019:解析外部符号_A86_ReadConfigReg @函数引用12 ......”

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

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

我该如何解决这个错误?

回答

0

你应该做的第一件事是检查库以确保引用的功能在那里。启动MSVC开发商命令提示符,运行DUMPBIN.EXE

语法:

dumpbin /exports <full path library name> 

这会给你所有从库中输出符号的列表。

您会从中更清楚地知道该做什么。

[编辑]

DUMPBIN告诉你,你的lib中导出一个叫A86_ReadConfigReg功能,这是一个__cdecl签名,而不是__stdcall签名像[email protected]你的连接预计....至少有两件事情你应按照优先顺序进行/检查。

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

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

像这样:

extern "C" { 
#include <mylib.h> 
} 
+0

我没有做到这一点,并从转储仓的输出中有一行显示: “15 A86_ReadConfigReg”。你下一步怎么做? – user2913869

+0

@ user2913869检查链接器问题的更新答案。 –

+0

调用约定的确被设置为__cdecl(/ Gd)。就像我在原始问题中提到的那样,头文件确实具有“extern”C“{}和括号之间列出的所有函数原型,我确实看到原型是这样定义的:int _stdcall A86_ReadConfigReg(int iHandle, DWORD dwOffset,DWORD * pdwResult);所以我也尝试将“_stdcall”标签改为“__cdecl”,然后完全删除它,但它仍然不会生成。 – user2913869

相关问题