构建二进制文件或库时,指定rpath,即
-Wl,rpath,<path/to/lib>
Run Code Online (Sandbox Code Playgroud)
告诉链接器在二进制文件的运行时在哪里找到所需的库.
什么是关于绝对路径和相对路径的UNIX哲学?使用绝对路径是否更好,以便可以从任何地方找到lib?或者是否更好地使它相对,因此复制整个目录或重命名更高级别的路径不会使二进制文件无法使用?
使用$ORIGIN通常是构建二进制文件的首选方法.对于我喜欢放入绝对路径的库,因为否则你将无法链接到库.符号链接将更$ORIGIN改为指向链接的路径而不是链接目标的路径.
Chr*_*odd 20
在这种情况下rpath,使用相对路径是没有意义的,因为相对路径将相对于当前工作目录,而不是相对于找到二进制/库的目录.所以它几乎不适用于$PATH几乎任何情况下在库或库中找到的可执行文件.
相反,你可以使用$ORIGIN"特殊"的路径,具有相对于与可执行文件的路径-Wl,-rpath,'$ORIGIN'-请注意,您需要周围的引号,以避免外壳把它解释为一个变量,如果你尝试做这一个Makefile,你需要$$避免做出解释$.
Emp*_*ian 14
什么是关于绝对路径和相对路径的UNIX哲学?
使用相对路径使得可执行文件仅在从特定目录调用时才起作用,这几乎不是您想要的.例如,如果可执行文件中/app/foo/bin/exe,具有DT_RUNPATH的lib/,并且依赖库中/app/foo/lib/libfoo.so,那么exe从调用时将只运行/app/foo,而不是从任何其他目录调用时.
使用绝对路径要好得多:您可以执行cd /tmp; /app/foo/bin/exe并使可执行文件仍然有效.然而,这仍然不太理想:您不能轻易拥有多个版本的二进制文件(在开发过程中很重要),并且您要求最终用户必须安装软件包.
在支持系统$ORIGIN,使用DT_RUNPATH的$ORIGIN/../lib会给你一个可执行的任何地方安装时从任何目录调用,只要为相对路径是什么在起作用bin/和lib/被保留.
来自Linux 编程接口:
\n\n\n在 rpath 中使用 $ORIGIN
\n假设我们想要分发一个使用某些自己的共享库的应用程序,但我们不想要求用户将库安装在标准目录之一中。相反,我们希望允许用户将应用程序解压到他们选择的任意目录下,然后立即能够运行该应用程序。问题是应用程序无法\n确定其共享库所在的位置,除非它请求\n用户进行设置
\nLD_LIBRARY_PATH或者我们要求用户运行某种\n识别所需目录的安装脚本。\n这两者都不是方法是可取的。为了解决这个问题,动态链接器被构建为理解规范中的特殊字符串$ORIGIN(或等效的${ORIGIN}) 。rpath动态链接器将此字符串解释为 \xe2\x80\x9c 包含应用程序的目录。\xe2\x80\x9d 这意味着我们可以使用以下命令构建应用程序:\n
$ gcc -Wl,-rpath,'$ORIGIN'/lib ...这假定在运行时应用程序\xe2\x80\x99s 共享库将\n驻留在包含应用程序可执行文件的目录下的子目录lib 中。然后,我们可以为用户提供一个简单的\n安装包,其中包含应用程序和相关的\n库,用户可以在任何位置安装该包并\n然后运行应用程序(即所谓的\xe2\x80\x9cturn -密钥应用程序\xe2\x80\x9d)。
\n
| 归档时间: |
|
| 查看次数: |
8313 次 |
| 最近记录: |