问题分析
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,也可以包装单个或多个函数生命,这取决于你自己的需要
将静态 C 库与 C++ 代码链接时引用链接“未定义的引用”错误
混合 C 和 C++……对函数的未定义引用 [关闭]
p>
为什么需要 extern “C”?
请登录后发表评论
注册
社交帐号登录