error adding symbols: DSO missing from command line

最近作作项目的时候,在编译代码的时候遇到不少棘手的问题,网上的资料也比较少。关于上诉问题,我就是来讲说看。html

DSO missing from command line缘由及解决办法,我也是看了这篇文章的介绍,才对这个错误有写认识。segmentfault

大概就是说,若是库B依赖了库A来静态编译,那么库B就会有库A的连接信息,那咱们就来讲说错误的状况app

$ g++ main.cpp -lA -lB -o main  

会输出spa

/usr/bin/ld: /usr/local/lib/libB.a(main.cpp.o): undefined reference to symbol '_a_symbol_name'
/usr/local/lib/libA.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

当时上文博主说过,在binutils<2.22的时候没有问题,后面就有问题了。code

那这个应该是编译问题,ld自动递归地解析连接的lib,当加载A库的时候,一切还正常,可是加载B库的时候,ld会自动的去解析他的静态连接,因此就重复了,致使error adding symbols。因此下面这个就没有问题了。htm

$ g++ main.cpp -lB -lA -o main  

这样就编译正常了,程序也可以正常运行。blog

关于连接库的顺序问题,我看了下连接库的顺序问题一文,正常的状况下,链动态接库时是从左至右开始连接,若是出现了顺序错误,gcc自动帮咱们重定位,我认为保险的方式是作好库的顺序。递归

那我这里稍微整理了下连接顺序。get

  1. 高层静态连接库it

  2. 底层依赖库

  3. 高层动态连接库

  4. 其余无关系连接库





….fuck,fuck! 重写两次了,第一次断电能理解,第二次莫名其妙的关了次电脑,来吧,咱们都是文明人,这只是个小插曲,咱们继续。。。

相关文章
相关标签/搜索