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

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

主要是下面这行错误:

error adding symbols: DSO missing from command line

场景是:

  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,而需要由用户来一一指定。

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

ld -v

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

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

时间仓促,没有贴代码上来,而且一定还有没有深入到的地方,日后再来完善,如果有不对的地方,欢迎指正!

DSO missing from command line原因及解决办法相关推荐

  1. 解决:无法添加符号: DSO missing from command line

    1.编译pulseaudio报错: /usr/bin/ld: /tmp/ccIkVVbs.o: undefined reference to symbol 'pa_log_level_meta' /u ...

  2. error adding symbols: DSO missing from command line

    原因:工程中有个 静态库 libxxx.a (xxx为你的库名称),这个静态库中没有找到对应的函数实现.但是在 /usr/lib64之类的路径中找到的libxxx.so.**中找到了函数实现. 解决方 ...

  3. Glib2之无法添加符号: DSO missing from command line(十九)

    1.报错: # gcc extended-test.c -lpulse -lpulse-simple /usr/bin/ld: /tmp/ccepJsJD.o: undefined reference ...

  4. [Linux] DSO missing from command line

    编译 FFmpeg 官方例程 gcc -o myplay demuxing_decoding.c -I /usr/local/include/ -L /usr/local/lib -lavformat ...

  5. DSO missing from command line

    g++ /home/haizi/local_install/lib/libglog.so.0: error adding symbols: DSO missing from command line ...

  6. 报错Command line is too long. Shorten the command line xxx【解决办法】

    运行springboot项目的时候,出现报错,报错信息如下: Error running OrderServiceBoot. Command line is too long. Shorten the ...

  7. error: unrecognized command line option '-fstack-protector-strong'解决办法

    原文地址:https://blog.csdn.net/u014134262/article/details/50402928 今天编译kernel 的时候,报error: unrecognized c ...

  8. Please choose a writable location using the '-configuration' command line option 的解决办法

    Invalid Configuration Location ,The configuration area at 'C:\Users\Administrator\ApplicationData\XM ...

  9. 解决/usr/local/lib/libglog.so.0: error adding symbols: DSO missing from command line

    第一步: // 查看目录 /usr/lib 或 /usr/local/lib的目录下是否存在libglog.so.0 $ find libglog* libglog.a libglog.la libg ...

最新文章

  1. android string.xml前后加空格的技巧
  2. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
  3. 哈啰在分布式消息治理和微服务治理中的实践
  4. c#中一个进程启动另一个进程并传递参数
  5. java unreported exception_Java异常处理
  6. 解决火狐https问题 安全连接问题
  7. PAT 乙级 1008. 数组元素循环右移问题 (20) Java版
  8. 推荐: 一个业务流程梳理工具Sam
  9. android内存溢出错误,Android Studio 生成 JavaDoc 空指针异常|文档编码出错|内存溢出...
  10. RabbitMQ学习——生产者与消费者入门例子
  11. 微软云计算解决方案与下一代数据中心
  12. 各区区号的字段和名称
  13. 优酷 IPv6 演进和实践指南
  14. python计算器实验报告_python作业模拟计算器开发(第五周)
  15. NYOJ 找球号(二)(哈希表)
  16. 【Linux】常用命令:网络、内存、cron 超详细介绍
  17. 微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端
  18. 把握云计算+引领云时代
  19. python用户输入字符串串从小到大排序_python字符串从小到大排序
  20. 太阳模拟器都能够实现哪些功能?

热门文章

  1. 以太坊开发入门,完整入门篇
  2. 大前端之前后分离02】前端模板嵌套问题
  3. 闲谈IPv6-尴尬的IPv4
  4. VC 定位窗体常用方法
  5. ios设计规范(下)
  6. LeetCode算法题-Detect Capital(Java实现)
  7. 入行AI,从何做起—光环飞马网直播课回顾
  8. Puppet 笔记 模板
  9. jsp中实现文件下载   两种方法
  10. PHP多次调用Mysql存储过程报错解决办法