1

让我们成为一个依赖于libB.so的可执行C.exe,它本身依赖于libA.soC.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
4

1 回答 1

1

您必须将 libA 创建为静态库(使用ar)。这样,它的代码将嵌入到 libB.so 中,并且您不会有额外的依赖项。

于 2012-05-02T12:29:17.027 回答