RPATH--RUNPATH
RPATH 是一种嵌入到二进制文件(可执行文件/库文件)中的路径信息,也就是存在于可执行文件或者库文件中的, 用RPATH(旧)或者RUNPATH(新)参数记录的路径信息, 指示动态链接器在运行时查找共享库的位置。
查看二进制文件的RPATH或者RUNPATH
readelf -d calib_3d_exec | grep RUNPATH
readelf -d calib_3d_exec | grep RPATH
设置二进制文件的RPATH/RUNPATH
if(NOT CMAKE_SKIP_RPATH)
set(CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/lib")
endif()
作用
如果没有明确禁用 RPATH(即 CMAKE_SKIP_RPATH 未设置为 TRUE), 则设置可执行文件或者库文件(这个CMakeLists中生成的)安装时的 RPATH 为 $ORIGIN:$ORIGIN/lib。
这条指令告诉编译器在生成的二进制文件(可执行文件或者库文件)中嵌入特定的 RPATH,以便在运行时能够找到所需的共享库。
CMAKE_INSTALL_RPATH
CMAKE_INSTALL_RPATH 是一个专门用于设置安装时 RPATH的变量。
$ORIGIN
这是一个特殊的符号,表示可执行文件或共享库所在的目录。它是相对于自身的位置来定义其他库的路径。使用 $ORIGIN 可以使得程序更加便携,因为库的路径是相对的,而不是绝对的。
示例: 如果你的可执行文件位于 /usr/local/bin/myapp,那么 $ORIGIN 就是 /usr/local/bin。 如果你的共享库位于 /usr/local/lib/mypkg/libmylib.so,那么 $ORIGIN 就是 /usr/local/lib/mypkg。
set之后,像列表中加入新的库文件路径:
list(APPEND CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/lib")