“图书馆路径”,' rpath'和' rpath-link'

时间:2017-03-01 09:50:15

标签: c++ linker linker-errors ld linker-flags

我注意到包括我在内的很多人都没有准确地知道链接器搜索路径背后的基本原理和用途:' library-path' rpath',和' rpath-link'。有人可以向我们解释一下吗?

上下文

在我读完之后,我倾向于想到“图书馆之路”。和' rpath'应该够了。 “rpath-link'的基本原理和预期用途对我来说是一个谜。让我解释一下原因。 设置'库路径'将指定的路径传递给链接器,以便在 link(/ build)time 的指定路径中查找库。
设置' rpath'将指定的路径存储在构建的可执行文件中,链接器随后在运行应用程序时查看指定的路径,即在运行时。 因此,如果您的图书馆位于非标准位置,那么您需要指定“图书馆路径”。构建你的可执行文件和' rpath'运行它。
现在,GNU链接器文档说:" -rpath和-rpath-link之间的区别在于-rpath选项指定的目录包含在可执行文件中并在运行时使用,而-rpath-link选项仅在链接时间。"
这提出了两个问题:
1)如果' r'在' rpath-link'代表'运行时',然后是名称' rpath-link'似乎有误导性,因为它在链接时使用 2)我已经在' library-path'中为链接时间指定了我的库目录。我认为没有用于' rpath-link'。奇怪的现实:来自http://www.kaizou.org/2015/01/linux-libraries/我知道'图书馆路径'不用于辅助依赖项(从一个共享库到另一个共享库的依赖项)。要解决这些辅助依赖关系,您需要设置' rpath'或者' rpath-link'。我的问题是:你可能不会使用图书馆路径'要指定辅助依赖关系,而是有义务使用' rpath-link'?

我是如何偶然发现这个问题的

我有一个名为app的可执行文件想要使用liba.so中的功能,所以我将应用程序链接到了liba.so. liba.so依赖于libb.so. liba.so和libb.so都驻留在目录mylibs中。当我想构建我的可执行文件时,我遇到了消息:

/usr/bin/ld: warning: libb.so.80, needed by /.../liba.so, not found (try using -rpath or -rpath-link)

后面有几个未定义的参考错误 要正确构建它,我必须设置两个库路径'和' rpath-link' (或' rpath')到目录mylibs。令我困惑的是为什么'图书馆路径'也不用于搜索辅助依赖项libb.so以及另一个“rpath-link”链接。必须设置为搜索此次要依赖项。

相关问题: Rationale of -rpath-link

0 个答案:

没有答案