c++ - 链接依赖

标签 c++ linux dynamic-linking

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

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

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

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

最佳答案

当您仅链接到 libB 时,链接器会查找 libA,但找不到它,因为它不在链接器/加载器的可找到路径中。您必须在链接阶段设置LD_LIBRARY_PATH(和/或LD_RUN_PATH),或者使用-rpath/some/链接libB

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

LD_LIBRARY_PATH=/some/lib ./foo

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

关于c++ - 链接依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884375/

相关文章:

c++ - "cdecl"代表什么?

c++ - 如何 spsc_queue.pop() 这个结构?

c++ - std::map - 使用下标运算符添加元素 Vs 插入方法

Lifebook P1610 Touch 上的 Linux

c++ - 输出流中的第一个字符被该流中删除的最后一个字符替换。为什么会这样?

shared-libraries - 如何在 Linux 上设置 LibGDX 的 fbx-conv

c - 进行(动态)链接所需的最少信息量?

c++ - 如何使用 typedef 简化作为函数指针的模板函数参数

linux - 用于重命名文件的 Shell 脚本 - Shell 脚本

GCC -rdynamic 不适用于静态库