DSO missing from command line的原因及解决方法
文章目录
最近在移植蓝牙,编译bt-service的时候,链接器报错:DSO missing from command line。用readelf/dumpobj查看符号,明明动态库里存在这个符号的,但就是链接失败,非常不理解。经调查,原来binutils>=2.22时,–no-copy-dt-needed-entries默认被打开了,ld不再会自动递归地解析链接的lib,而需要用户来一一指定,因bt-service依赖的库特别多,且存在互相依赖,只能加上–copy-dt-needed-entries解决。
场景还原:
- shared libA中,定义了函数foo()
- 静态库libB显示地链接了libA
- 可执行文件bin_c显示地链接了libB
如果bin_c中调用了函数foo(),那么ld>2.22时,链接需要显式指定libA,这样做的好处在于,当libA有变化,甚至foo接口发生变化时,编译时就能报错。
文章作者 carter2005
上次更新 2019-01-14