【问题标题】:How to avoid that an executable cares about the dependencies of its dependencies?如何避免可执行文件关心其依赖项的依赖关系?
【发布时间】:2012-05-11 22:12:29
【问题描述】:

让一个可执行的C.exe 依赖于libB.so,它本身依赖于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

【问题讨论】:

    标签: c++ linux dependencies shared-libraries


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我有点不情愿使用静态库,因为 libA 实际上是一大堆库 (root.cern.ch),数量高达数百 MB。
    • 链接是“智能的”。它不包括完整的静态库(取决于编译器)。因此,即使您的静态库是 100 MB,也可能只链接其中的 50 KB。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2015-12-28
    • 2020-04-06
    • 2016-05-12
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多