从/ some / lib中的共享库libA.so开始。 我构建了依赖于libA.so中的功能的库(libB.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”的想法。我做错了什么吗?
答案 0 :(得分:4)
当您仅链接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 ...
将选项传递给链接器。)相同的加载时解析过程适用于动态库本身。