正确使用rpath(相对vs绝对)

时间:2016-06-27 15:38:02

标签: gcc linker rpath

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

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

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

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

更新

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

2 个答案:

答案 0 :(得分:18)

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

相反,您可以使用$ORIGIN“特殊”路径来获取与-Wl,-rpath,'$ORIGIN'的可执行文件相关的路径 - 请注意,您需要在其周围引用以避免使用shell将其解释为变量,如果您尝试在Makefile中执行此操作,则需要$$以避免同时解释$

答案 1 :(得分:12)

  

这里有关于绝对路径和相对路径的UNIX语言是什么?

使用相对路径生成一个可执行文件,从特定目录调用时,几乎从不你想要的。例如。如果可执行文件位于/app/foo/bin/exeDT_RUNPATHlib/,并且从属库位于/app/foo/lib/libfoo.so,则exe仅在/app/foo调用时运行{1}},而不是从任何其他目录调用时。

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

在支持$ORIGIN的系统上,使用DT_RUNPATH $ORIGIN/../lib将为您提供一个可执行文件,只要安装在任何位置并从任何目录调用,只要相对路径{{1}保留{}}和bin/