【问题标题】:Linking dependency链接依赖
【发布时间】:2011-10-16 14:18:40
【问题描述】:

从 /some/lib 中的共享库 libA.so 开始。 我构建了依赖于 libA.so 功能的库 (libB.so)。因此,在创建 libB.so 时,我在 g++ 命令行中包含 -L/some/lib -lA。 libB.so 也将驻留在 /some/lib 中。

现在,我正在构建一个将使用 libB.so 的可执行文件。我将预期的 -L/some/lib 和 -lB 提供给 g++ 链接器。但我收到一个错误,因为它找不到“libA.so”。如果我在链接器行中添加“-lA”,程序就会链接。

我不明白为什么它找不到“libA.so”。我当然不明白为什么在链接器行中包含“-lA”会让它找到它。它似乎已经知道它需要 libA.so,并且 libA.so 与 libB.so 处于同一路径。

有人能解释一下吗?我不喜欢必须在每个想要链接 libB.so 的可执行文件中显式放置“-lA”的想法。我做错了什么吗?

【问题讨论】:

    标签: c++ linux dynamic-linking


    【解决方案1】:

    当您仅针对libB 进行链接时,链接器会查找libA,但无法找到它,因为它不在链接器/加载器的可找到路径中。您必须在链接阶段设置LD_LIBRARY_PATH(和/或LD_RUN_PATH),否则将libB-rpath /some/lib 链接。

    请假装libB 本身就是一个可执行文件,我们称它为foo。您不能只在命令行中说./foo,因为找不到libA(检查ldd foo 以检查加载程序路径)。相反,您需要

    LD_LIBRARY_PATH=/some/lib ./foo
    

    或者你需要用rpath编译。 (在g++ 中,您会说g++ -Wl,-rpath,/some/lib ... 将选项传递给链接器。)同样的加载时解析过程也适用于动态库本身。

    【讨论】:

    • 为什么“-lA”把它放在可找到的路径中?在我看来,“-lA”将它放在需要找到的对象列表中,而不是找到它的路径。
    • 我们来看一个简单的程序:当你说g++ -o foo foo.o -lA -L/some/lib时,链接器会找到库libA,但你仍然不能运行程序,因为 loader 没有找到它。你需要像我的例子一样运行程序,设置LD_LIBRARY_PATH。不要混淆链接和加载!
    • 如果最终的可执行文件只使用来自 libB 的函数/类,为什么它还需要链接到 libA?在 Windows 中,您真的不必这样做。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2014-11-21
    • 2019-04-28
    • 2011-01-29
    • 2011-01-18
    相关资源
    最近更新 更多