动态link库相互依赖时link顺序的问题

The problem of link order when dynamic link libraries depend on each other

抱歉我的英语不好。

GCC编译时,如果main.o依赖liba.soliba.so依赖libb.so

那么你应该先linkliba.so然后libb.so。反之则会出错

我学习的原因是:

编译器会依次遍历所有.o, .so个模块,如果遇到未定义的符号则将其放入链表U

在依次遍历所有.o, .so模块的过程中,.o, .so中的符号用于解释列表U中的符号

遍历结束,如果U中还有未定义符号,则报未定义符号错误

所以如果 liba.solibb.so 相互依赖,理论上我需要 link 他们像这样:

-la -lb -la

但是实际运行表明liba.so不需要linked两次

为什么?

是我学错了link原理,还是编译器优化了

if main.o depends on liba.so, and liba.so depends on libb.so
Then you should link liba.so first and then libb.so. Conversely, an error will occur

你倒过来了:如果 liba.so 取决于 libb.so,那么正确的 link 顺序是 -la -lb

However, the actual operation shows that liba.so does not need to be linked twice

Why?

一般来说,对于 UNIX link 用户,顺序很重要 对存档库。

与存档库不同,当 linking 共享库时,您将获得 整个 库,因此如果它出现在 link 行一次,再也不需要重复了。

要了解为什么您 可能 需要在 link 行重复归档库,请阅读 this

Is the link principle I learned wrong, or did the compiler optimize it

你说的“原理”是错误的(倒过来的),编译器根本没有参与link阶段。