GCC编译时,若A.o
依赖 liba.so
, liba.so
依赖libb.so
则应该先链接liba.so
后链接 libb.so
,反过来则会出错
我学习到的原因是:
编译器会顺序遍历所有的.o
、.so
模块,遇到未定义的符号则放入列表U
顺序遍历所有的.o
、.so
模块的过程中,使用该.o
、.so
中的符号对列表U
中的符号进行解释
遍历结束时,若U
中仍然存在未定义符号,则报告Undefined symbol
错误
那么如果liba.so
和libb.so
互相依赖,理论上需要-la -lb -la
但实际操作发现,不需要链接liba.so两次
请问:
是我学习到的链接原理有误,还是编译器进行了相关优化?
优化了