velscode 2021-08-21 11:36 采纳率: 0%
浏览 40

C语言动态库互相依赖链接顺序问题

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.solibb.so互相依赖,理论上需要
-la -lb -la

但实际操作发现,不需要链接liba.so两次

请问:
是我学习到的链接原理有误,还是编译器进行了相关优化?

  • 写回答

1条回答 默认 最新

  • StjpStjp 2021-08-21 11:38
    关注

    优化了

    评论

报告相同问题?

问题事件

  • 创建了问题 8月21日