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
两次
请问:
是我学习到的链接原理有误,还是编译器进行了相关优化?