【发布时间】:2021-08-23 01:49:00
【问题描述】:
对不起,我的英语不好。
GCC编译时,如果main.o依赖liba.so,而liba.so依赖libb.so
那么你应该先链接liba.so,然后再链接libb.so。反之则会出错
我学到的原因是:
编译器会依次遍历所有.o, .so模块,如果遇到未定义符号则放入列表U中
在依次遍历所有.o, .so模块的过程中,.o, .so中的符号用于解释列表U中的符号
遍历结束,如果U中还有未定义符号,则报未定义符号错误
所以如果liba.so和libb.so相互依赖,理论上我需要像这样链接它们:
-la -lb -la
但是实际运行表明liba.so不需要链接两次
为什么?
是链接原理我学错了,还是编译器优化了
【问题讨论】:
-
使用静态库,您可能需要按照您的假设进行操作。使用共享库,一旦使用一个符号,所有符号都可用,因此重复库是不必要的。现代链接器有一些选项可以自动重新处理静态库组。
-
现代链接器有一些选项可以自动重新处理静态库组。 --> 这是否意味着我不需要关心我的静态库链接顺序? @JonathanLeffler
标签: c linux linker shared-libraries