rpath 的正确用法(相对与绝对)
correct usage of rpath (relative vs absolute)
构建二进制文件或库时,指定 rpath
,即
-Wl,rpath,<path/to/lib>
告诉 linker 在二进制文件运行时在哪里可以找到所需的库。
此处关于绝对路径和相对路径的 UNIX 哲学是什么?使用绝对路径是否更好以便可以从任何地方找到该库?还是让它成为相对的更好,这样复制整个目录或重命名更高级别的路径不会导致二进制文件无法使用?
更新
使用 $ORIGIN
通常是构建二进制文件的首选方式。对于库,我喜欢放在绝对路径中,否则你将无法 link 到库。符号 link 会将 $ORIGIN
更改为指向 link 而不是 link [=24= 的路径]目标.
在 rpath
的情况下,使用相对路径是没有意义的,因为相对路径将相对于当前工作目录,而不是相对于 binary/library 所在的目录被找到。因此,它根本不适用于 $PATH
中的可执行文件或几乎任何情况下的库。
相反,您可以使用 $ORIGIN
"special" 路径来获得相对于具有
-Wl,-rpath,'$ORIGIN'
的可执行文件的路径——请注意,您需要在其周围加上引号避免 shell 将其解释为变量,如果您尝试在 Makefile 中执行此操作,则需要 $$
以避免 make 也将 $
解释为变量。
What is the UNIX philosphy regarding absolute and relative paths here?
使用相对路径使可执行文件仅在从特定目录调用时工作,这几乎从不您想要的。例如。如果可执行文件在 /app/foo/bin/exe
中并且有 DT_RUNPATH
个 lib/
,并且依赖库在 /app/foo/lib/libfoo.so
中,那么 exe
只会 运行从 /app/foo
调用时,而不是从任何其他目录调用时。
使用绝对路径要好得多:您可以 cd /tmp; /app/foo/bin/exe
并让可执行文件仍然有效。然而,这仍然不太理想:您不能轻易拥有多个版本的二进制文件(在开发过程中很重要),并且您向最终用户指示他们必须安装软件包的位置。
在支持 $ORIGIN
的系统上,使用 $ORIGIN/../lib
的 DT_RUNPATH
会给你一个可执行文件,只要安装到任何目录并从任何目录调用,只要 DT_RUNPATH
的相对路径 bin/
和 lib/
被保留。
构建二进制文件或库时,指定 rpath
,即
-Wl,rpath,<path/to/lib>
告诉 linker 在二进制文件运行时在哪里可以找到所需的库。
此处关于绝对路径和相对路径的 UNIX 哲学是什么?使用绝对路径是否更好以便可以从任何地方找到该库?还是让它成为相对的更好,这样复制整个目录或重命名更高级别的路径不会导致二进制文件无法使用?
更新
使用 $ORIGIN
通常是构建二进制文件的首选方式。对于库,我喜欢放在绝对路径中,否则你将无法 link 到库。符号 link 会将 $ORIGIN
更改为指向 link 而不是 link [=24= 的路径]目标.
在 rpath
的情况下,使用相对路径是没有意义的,因为相对路径将相对于当前工作目录,而不是相对于 binary/library 所在的目录被找到。因此,它根本不适用于 $PATH
中的可执行文件或几乎任何情况下的库。
相反,您可以使用 $ORIGIN
"special" 路径来获得相对于具有 -Wl,-rpath,'$ORIGIN'
的可执行文件的路径——请注意,您需要在其周围加上引号避免 shell 将其解释为变量,如果您尝试在 Makefile 中执行此操作,则需要 $$
以避免 make 也将 $
解释为变量。
What is the UNIX philosphy regarding absolute and relative paths here?
使用相对路径使可执行文件仅在从特定目录调用时工作,这几乎从不您想要的。例如。如果可执行文件在 /app/foo/bin/exe
中并且有 DT_RUNPATH
个 lib/
,并且依赖库在 /app/foo/lib/libfoo.so
中,那么 exe
只会 运行从 /app/foo
调用时,而不是从任何其他目录调用时。
使用绝对路径要好得多:您可以 cd /tmp; /app/foo/bin/exe
并让可执行文件仍然有效。然而,这仍然不太理想:您不能轻易拥有多个版本的二进制文件(在开发过程中很重要),并且您向最终用户指示他们必须安装软件包的位置。
在支持 $ORIGIN
的系统上,使用 $ORIGIN/../lib
的 DT_RUNPATH
会给你一个可执行文件,只要安装到任何目录并从任何目录调用,只要 DT_RUNPATH
的相对路径 bin/
和 lib/
被保留。