三方库中搜索未定义的符号(三方库有没有)问题分析

问题分析

C++程序,在链接阶段,当你的程序引用第三方库中定义的函数时(程序内部定义的函数不涉及这个问题,因为函数的实现已经在自己的代码段和数据段中了),链接器会在三方库中查找当前符号表中的未定义符号(这些未定义符号需要位于三方库中,否则会有未定义函数供xxx引用),当对应的符号不能在三方库的符号表中找到,会报一个未定义的对xxx函数的引用。

注意,遇到这个问题,首先要排除第三方库是否链接正确。第三方库未正确链接时,报错一般是“找不到-lxxxlib”,即找不到xxx库,不是未定义的引用。因此,当遇到未定义的问题时,库已经被链接。 ,但找不到符号。

未定义引用有两个原因:

第三方库没有符号,或者没有符号的定义。通过readelf -s xxx.lib,可以查看第三方库中符号的状态。如果符号丢失,或者符号未定义,那么第三方库本身就有问题。该符号确实在三方库中定义,但您的链接器找不到。为什么找不到?最可能的原因是你在混合c/c++编程时会遇到的情况:即第三方库是c库,提供的符号是c编译器生成的,没有名字修饰pod导入找不到头文件,比如for A function int add (double, double) 在三方库中,c编译器形成的符号类似于_add,但是c++编译器生成的符号如_adddd,那么,当你在c++程序中,当包含第三方c库,c++编译器会对第三方库中的函数名进行命名,然后尝试在第三方库中搜索_adddd等符号。显然,这样的 Symbols 不在三方库中。解决办法

解决方法很简单,就是用extern C { your function decleration }来包装你的函数生命pod导入找不到头文件,然后括号里的函数会被C编译器编译,生成的符号不会有名字修饰。该符号存在于三方库xxx.lib中,消除了未定义引用的问题。

extern c 可以用来包装#include your_header,也可以包装单个或多个函数生命,这取决于你自己的需要

图片[1]-三方库中搜索未定义的符号(三方库有没有)问题分析-老王博客

图片[2]-三方库中搜索未定义的符号(三方库有没有)问题分析-老王博客

将静态 C 库与 C++ 代码链接时引用链接“未定义的引用”错误

混合 C 和 C++……对函数的未定义引用 [关闭]

p>

为什么需要 extern “C”?

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论