从/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/