c ++ visual studio,使用.lib文件的未解析的外部符号

时间:2017-07-19 22:04:49

标签: c++ visual-studio linker shared-libraries

我继承了一个遗留项目,该项目利用* .lib中的一些外部函数。根据我的说法,使用* .lib的语法是正确的 可以在他们使用的任何视觉工作室版本中构建。 (即,有一个extern" C"原型文件,并且所有功能签名都是正确的。)

构建时,我得到"错误LNK2019:未解析的外部符号_A86_ReadConfigReg @ 12在函数中引用..."

我非常确信这与* .lib文件有关,因为* .lib文件有" A86"在名称中......还有一个* .dll具有相同的名称。

我去了项目属性 - >链接器 - >在"附加依赖项"中输入并列出* .lib文件名,但没有运气。我尝试添加include目录,复制* .lib& * .dll到可执行位置。但没有运气。

如何修复此错误?

1 个答案:

答案 0 :(得分:0)

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

语法:

dumpbin /exports <full path library name>

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

您可以更清楚地了解该怎么做。

<强> [编辑]

dumpbin告诉你,你的lib导出了一个名为A86_ReadConfigReg的函数,它是一个__cdecl签名,而不是你的链接器所期望的_ {stdcall签名,如_A86_ReadConfigReg@12 ....至少应该做两件事/按优先顺序检查。

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

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

  3. 像这样:

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