gpt4 book ai didi

c++ - 当我使用的库使用的库发生变化时,我的可执行文件是否需要重新链接?

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:51 24 4
gpt4 key购买 nike

假设我们有一个依赖共享库 foo 的可执行文件 exe,而共享库 foo 又依赖于共享库 bar:< em>exe 需要 libfoo.sofoo 需要 libbar.so。然后,bar 以源代码兼容的方式更改(即 API 不变),但不是以二进制兼容的方式(即 ABI 更改)。因此,我们必须重新链接(或面对分割错误)。

问题是:到底应该重新编译/重新链接什么?


让我更具体一点。要链接 exe,我们不需要添加编译器选项“-lbar”,而我们确实需要该选项来链接 foo:

gcc -fPIC -shared -I. -Ibar -lbar -o libfoo.so foo.o
gcc -fPIC -I. -Ifoo -Ibar -lfoo -o exe exe.o
  1. 因此,重新链接 foo 并保持 exe 不变就足够了吗?

  2. fooexe 是否也需要重新编译(如果 bar 改变了,但它的 API 没有改变)?

最后,我尝试保持 foo 不变,但使用添加的“-lbar”编译器选项重新链接 exe:

gcc -fPIC -I. -Ifoo -Ibar -lfoo -lbar -o exe exe.o

这确实消除了段错误,这可能意味着所有内容都已正确链接...或者可能是运气(因为段错误并不总是发生,即使有继承内存问题)。

  1. 是否允许这样做,即保持 foo 不变,但将 exe 明确链接到 bar

一些相关读物:[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ]

最佳答案

在专家回答之前,这些是我自己的假设:

  1. 鉴于链接器不需要为 exe 使用“-lbar”,我倾向于认为 exe 不需要重新链接,因为链接器显然不需要bar。但是,我对此非常不确定,因为这假设链接器没有通过 foo 找到 bar。 (毕竟,ldd libfoo.so 会向我展示 bar,所以我想说链接器可能拥有它需要 bar 的知识.)

  2. 不,他们没有。源是兼容的,因此编译(目标)文件中的符号应该仍然是正确/兼容的。但是,可执行文件确实需要重新链接,因为这些符号在目标文件中的位置已更改。

  3. 这似乎是允许的...但我不确定。另外:除了 exe 之外,任何依赖于 foo 的可执行文件/库仍将面临段错误,所以这是不好的做法,不是吗?

关于c++ - 当我使用的库使用的库发生变化时,我的可执行文件是否需要重新链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678029/

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