链接错误问题原因定位
来源:互联网 发布:校园网络交流平台 编辑:程序博客网 时间:2024/05/02 02:03
晚上快下班的时候,突然同事发邮件说使用的一个开源软件怎么编译都编译不过,报undefined reference to '' ld return error什么的,晚上只好加班帮同事解决一下。
看了下Makefile,幸好只有几行,使用了-lavcodec -lavformat -lavutil,运行make后报错误,说找不到avcodec_open2。
首先想到的是lib的导入路径可能有问题,专门对/usr/local/lib等几个地方找了下,发现libavcodec.so 等的都是存在的。之后想到可能是3个库依赖的顺序可能存在问题,就挨个调整了一遍,问题依然没有解决。
这个时候我又去/usr目录下grep了一把avcdec_open2这个函数,花了一段时间才返回libavcodec.a libavformat.a中存在匹配,为了确认问题出在哪个库上,我把三个库全部去掉依次再加上,发现libavcodec是问题的原因所在,avcdec_open2是由libavcdec导出的。
这个时候我陷入了困境,实在想不通库存在,依赖顺序也没有问题,为神马编译通不过,好痛苦,一阵咒骂开源的软件版本适配太麻烦。
出于没有办法,就想既然共享库编不过,那就用静态库编译吧,于是指定libavcodec.a与源文件一起编译,结果引出另外一个无法解决的依赖,而且新出现的依赖我无法定位是在哪个库中,走静态编译的路也堵死了。
想来想去问题还是出现在libavcodec.so中,突然想到把其中的符号表导出来看看,于是readelf -s libavcodec.so |grep open2,结果没有找到匹配,而readelf -s libavcodec.a |grep open2却找到了avcodec_open的函数原型,原来是libavcodec.so中没有导出需要的函数,难怪链接不上。
由于后面花了不少时间在静态编译上,试图找到相关的依赖文件,试了近半个小时,放弃了。我怀疑可能是共享库的编译有问题,就重新到依赖库的源码中,试图编译一下动态库,但编译失败。不得不从新下了个较高版本的库,解压,配置,最后成功编译成动态库,安装到系统中。回到开始的地方,make了一下,直接成功,问题解决。
- 链接错误问题原因定位
- XCode 链接错误原因
- iOS 定位错误原因方法
- 链接错误LNK2001的常见原因
- 链接错误LNK2001的可能原因
- 链接错误LNK2001的产生原因
- 几个可能导致链接错误的原因
- 编译uboot出现链接错误--原因
- 关于链接错误的一个罕见原因
- studio编译问题,使用cmd定位原因
- 段错误问题定位总结
- QQ用户昵称显示出现脚本错误的原因定位
- 关于IE6中absolute定位错误的原因及解决方案
- 锤子手机失败的原因:错误的定位
- 解决CMFCColorButton链接错误问题
- outlook出现"定位链接浏览器"错误的解决办法
- 链接错误LNK2001的可能几种原因
- LNK2001链接错误产生的原因分析和解决办法
- JS Replace 全部替换字符 用法
- 打开IE时,弹出对话窗口,提示“您计算机上某个程序已损坏了您对 Internet Explorer 默认搜索提供程序的设置”
- vc的一些文件后缀
- 正则习点 --- 09
- windows 命令大全
- 链接错误问题原因定位
- 线性代数学习框架
- eclipse、myeclipse使用常用的小技巧(eclipse alt+/ 自动补全 )
- C++虚函数
- 圖像曲率問題(高斯曲率,主曲率,平均曲率)
- linux中添加新的硬盘
- linux获取网络信息
- 一種簡單,快速,精准的sin/cos函數模擬,及as3實現
- 用Excel制作抽奖软件