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

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

这个问题在这里已经有了答案:





What is an undefined reference/unresolved external symbol error and how do I fix it?

(37 个回答)


4年前关闭。




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

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

我很确定这与 *.lib 文件有关,因为 *.lib 文件的名称中有“A86”……还有一个同名的 *.dll。

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

我该如何解决这个错误?

最佳答案

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

句法:

dumpbin /exports <full path library name>

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

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

[编辑]

dumpbin 告诉你,你的 lib 导出了一个名为 A86_ReadConfigReg 的函数。 ,这是一个 __cdecl 签名,而不是像 _A86_ReadConfigReg@12 这样的 __stdcall 签名您的链接器所期望的......您应该按照优先级顺序至少做两件事/检查。
  • 您的链接器正在寻找帕斯卡调用签名,这很奇怪。您的项目是否将 __stdcall 作为函数调用的默认值?这由 Project Properties->C/C++->Advanced->Calling Convention 中的/Gz 开关控制。 .默认应设置为 __cdecl (/Gd)
  • 您应该检查您的包含文件是否将所有函数声明包含在 extern "C" { } 中。堵塞。如果没有,您可以将 block 放在#include 指令周围,这样您就不必修改库的文件。

  • 像这样:
    extern "C" {
    #include <mylib.h>
    }
    

    关于c++ Visual Studio,使用.lib文件未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45201826/

    相关文章:

    Python C,待定,从多个线程调用一个函数

    c++ - 如何在 C 中找到可执行文件的位置?

    c++ - 实现二叉树遍历时的核心转储

    c++ - 在编译时获取 boost::function arity?

    c# - Visual Studio Intellisense 不显示某些类

    Visual Studio 2010 速成版的 Javascript 插件

    c++ - 在构建时是否发生了特定于静态链接的任何事情

    c++ - 是否有任何标准的 visual studio 2008 插件可用于跟踪/记录 C++ 项目的构造函数和析构函数调用

    c++ - 定义 main 时 MSVS2010 中的 LNK1561 链接错误

    c++ - 简单派生类上的 Linux GCC 链接错误