20

在构建二进制文件或库时,指定rpath,即

-Wl,rpath,<path/to/lib>

告诉链接器在二进制文件运行时在哪里可以找到所需的库。

这里关于绝对路径和相对路径的 UNIX 哲学是什么?使用绝对路径是否更好,以便可以从任何地方找到 lib?还是让它相对更好,这样复制整个目录或重命名更高级别的路径不会使二进制文件不可用?

更新

使用$ORIGIN通常是构建二进制文件的首选方式。对于库,我喜欢放在绝对路径中,否则你将无法链接到库。符号链接将指向链接$ORIGIN的路径而不是链接目标的路径。

4

2 回答 2

39

在 的情况下rpath,使用相对路径是没有意义的,因为相对路径将相对于当前工作目录,而不是相对于找到二进制/库的目录。$PATH因此,在几乎任何情况下,它都不适用于在或库中找到的可执行文件。

相反,您可以使用$ORIGIN“特殊”路径来获得相对于可执行文件的路径
-Wl,-rpath,'$ORIGIN'- 请注意,您需要在其周围加上引号以避免 shell 将其解释为变量,如果您尝试在 Makefile 中执行此操作,您还需要$$避免 make 解释$

于 2016-06-27T15:47:53.420 回答
23

这里关于绝对路径和相对路径的 UNIX 哲学是什么?

使用相对路径使可执行文件在从特定目录调用时才有效,这几乎不是您想要的。例如,如果可执行文件位于/app/foo/bin/exe并具有DT_RUNPATHof lib/,并且依赖库位于 中/app/foo/lib/libfoo.so,则exe仅当从 调用时才会运行/app/foo,而从任何其他目录调用时则不会运行。

使用绝对路径要好得多:您可以执行cd /tmp; /app/foo/bin/exe并让可执行文件仍然有效。然而,这仍然不太理想:您不能轻易拥有二进制文件的多个版本(在开发过程中很重要),并且您向最终用户指示他们必须在哪里安装软件包。

在支持. $ORIGIN_ _ _DT_RUNPATH$ORIGIN/../libbin/lib/

于 2016-06-27T15:50:34.733 回答