链接依赖

时间:2011-07-30 16:11:59

标签: c++ linux dynamic-linking

从/ 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”的想法。我做错了什么吗?

1 个答案:

答案 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 ...将选项传递给链接器。)相同的加载时解析过程适用于动态库本身。

相关问题