链接错误问题原因定位

来源:互联网 发布:校园网络交流平台 编辑:程序博客网 时间: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了一下,直接成功,问题解决。

      

   

原创粉丝点击