DSO missing from command line缘由及解决办法

最近项目正经历着一次更新,一系列编译工具都进行了大版本的升级,随时而来的是,本来正常编译的代码出现了大量的warning,最终编译失败,其中一个问题困扰了比较长的时间,虽然fix的方法不难,可是一直不清楚根本缘由,经过大量的google,终于找到的缘由,特意记录一下。ubuntu

先把主要的参考文章写一下:
Understanding DSO link change
Tool Chain Transition函数

主要是下面这行错误:工具

error adding symbols: DSO missing from command line

场景是:google

  1. 咱们有一个shared libA中,定义了函数foo()
  2. 另外一个静态库libB显示地连接了libA
  3. 一个可执行文件bin_c显示地连接了libA

那么问题来了,若是bin_c中调用了函数foo(),那么编译能不能经过?
在binutils<2.22时,ld正常完成了,bin_c对于foo的调用经由libB,传递到了libA,连接成功。
可是当binutils>=2.22时,编译出错了,ld会报上面的错,告诉你foo这个symbol解析不到,这时,咱们须要编译bin_c时,显示地连接libA才能够经过。
binutils2.22开始,其中的ld开始把--no-copy-dt-needed-entries默认打开,这样一来,ld不会再自动递归地解析连接的lib,而须要由用户来一一指定。code

PS:检查binutils的版本,方法很简单:递归

ld -v

这样作的好处在于当libA有变化,甚至foo接口发生变化时,编译时就能报错。接口

另外,还以一个ld的选项--allow-shlib-undefined,做用是容许在动态库中存在未解析到的函数symbol,至于理由能够自行查看man ld,由于有些项目就是在运行时才能决定使用的动态库, ld的manual中也举了一个相应的例子。get

时间仓促,没有贴代码上来,并且必定还有没有深刻到的地方,往后再来完善,若是有不对的地方,欢迎指正!it

相关文章
相关标签/搜索