记一次 链接undefined func定位过程

 

先编译好引用的动态库后,编译可执行程序链接提示undefined function_xxx

问题排查
1、函数声明
c和c++混编,所以必须声明为extern "C"
因为此函数定义在c中,在c++文件中需要声明extern "C"
如果未声明则编译不过
提示 error: ‘function_xxx’ was not declared in this scope

说明函数声明生效了

2、检查引用库是否有此函数
nm命令查看的确存在
[root@xxx]#nm -D libxxxx.so |grep function_xxx
00000000000ff644 t function_xxx

明明有定义怎么程序链接失败呢

3、没有正确找到库文件吗?删除链接库,则提示链接库找不到,说明库已经链接了,没问题
---很苦恼,直挠头,费了好几根头发,只剩笨办法了,自己编一个试试
4、自己编写了一个动态库,发现可以引用
用nm命令看一下有什么
[root@xxx]# nm -D libyyyy.so |grep function_xxx
000000000002b5ab T function_xxx

发现问题了吗?
前面未定义的的function_xxx 在动态库中符号列是小写t,这里libyyyy是大写T,首先用man看一下此命令,仅说明了函数定义在代码段,但一定有区别,声明一个static函数看一下,也是小写的
百度nm命令,其中有一篇文章说了这一点
https://www.cnblogs.com/LiuYanYGZ/p/5536607.html
符号类型:对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。local的符号不能被外部使用

5、发现了问题所在了,这是怎么回事呢,走查libxxxx.so库的CMAKElist文件
target_compile_options(libxxxx PRIVATE "-fvisibility=hidden")
不知道什么意思,再百度,说是符号隐藏了,也就是说默认是不可见的,要想可见就得另外声明
使用__attribute__((visibility("default"))) 声明函数

https://blog.csdn.net/qq_37887537/article/details/89472705

6、修改后,再看一下编译的库内符号变成了大写T
[root@cyl /home/upf_0428/agile-core-upf]#nm -D build/src/sp/libxxxx.so |grep function_xxx
00000000000ffa52 T function_xxx

程序编译ok

 

原文链接: https://www.cnblogs.com/linxiafeng/p/15821079.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    记一次 链接undefined func定位过程

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/186746

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午11:10
下一篇 2023年2月12日 上午11:10

相关推荐