让我们成为可执行文件 C.exe ,具体取决于 libB.so ,它本身依赖于 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>
我原以为libA.so只会在检查libB.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
答案 0 :(得分:1)
您必须将libA创建为静态库(使用ar
)。这样它的代码就会嵌入到libB.so中,你就不会有额外的依赖。