gpt4 book ai didi

c - 动态链接库相互依赖时的链接顺序问题

转载 作者:行者123 更新时间:2023-12-04 14:04:55 27 4
gpt4 key购买 nike

抱歉我的英语不好。

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

那么你应该先链接liba.so,然后再链接libb.so。反之就会出错

我了解到的原因是:

编译器会依次遍历所有的.o,.so模块,遇到 undefined symbol 就放入列表U中

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

遍历结束,如果U中还有 undefined symbol ,则报 undefined symbol 错误

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

-la -lb -la

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

为什么?

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

最佳答案

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,那么正确的链接顺序是 -la -lb

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

Why?

一般来说,对于 UNIX 链接器,顺序对存档库有影响。

与归档库不同,链接共享库时,您会得到整个库,因此如果它在链接行中出现一次,就无需再次重复。

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

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

你说的“原则”是错误的(倒过来的),编译器根本不参与链接阶段。

关于c - 动态链接库相互依赖时的链接顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68886461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com