让我们成为一个依赖于libB.so的可执行C.exe,它本身依赖于libA.so。C.exe不直接使用libA。工具 ldd 显示 C.exe 仍然需要 libA.so :
> ldd C.exe
libB.so => ./libB.so (0x00002b11cc4f5000)
libA.so.1 => ./libA.so.1 (0x00002b11cc719000)
<snip>
我原以为只有在检查 libB.so 时才会显示 libA.so。有没有办法避免这种行为或者你认为它是正确的?
我的问题是 libA 可以更新到版本 2,因此库名称将更改为 libA.so.2。我重新编译了 libB 但没有重新编译 C.exe。我期待 C.exe 运行良好,因为它取决于 libB,它知道选择哪个 libA,但事实并非如此。
如何处理这种情况?
编译和链接细节
libA.so 以这种方式编译和链接:
g++ -fPIC -Wall -shared -Wl,-soname,libA.so.1 libA.cpp -o libA.so.1
ln -s libA.so.1 libA.so
libB.so 以这种方式编译和链接:
g++ -fPIC -Wall -shared -L. -lA libB.cpp -o libB.so
C.exe 是这样编译和链接的:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
g++ -fPIC -Wall -L. -lB exeC.cpp -o C.exe