什么';CMAKE_INSTALL_前缀和CMAKE_INSTALL_RPATH之间的区别是什么
我很难理解CMAKE_INSTALL_前缀和CMAKE_INSTALL_RPATH之间的区别 如果我理解清楚的话,CMAKE_INSTALL_PREFIX是将要安装的前缀目录。因此,如果我使用以下脚本进行安装:什么';CMAKE_INSTALL_前缀和CMAKE_INSTALL_RPATH之间的区别是什么,cmake,Cmake,我很难理解CMAKE_INSTALL_前缀和CMAKE_INSTALL_RPATH之间的区别 如果我理解清楚的话,CMAKE_INSTALL_PREFIX是将要安装的前缀目录。因此,如果我使用以下脚本进行安装: project(hello) add_library(hello hello.h hello.cpp) set(CMAKE_INSTALL_PREFIX "c:/ABC/DEF") INSTALL(TARGETS hello EXPORT hello_export
project(hello)
add_library(hello hello.h hello.cpp)
set(CMAKE_INSTALL_PREFIX "c:/ABC/DEF")
INSTALL(TARGETS hello EXPORT hello_export
RUNTIME DESTINATION bin
LIBRARY DESTINATION bin
ARCHIVE DESTINATION lib
FRAMEWORK DESTINATION bin
INCLUDES DESTINATION include
)
然后静态库将安装在C:/ABC/DEF/lib中
那么,我的问题是使用CMAKE_INSTALL_RPATH有什么意义 在支持路径形式为
c:/ABC/DEF
(即Windows)的系统上,无。Windows二进制文件没有一个概念
在具有DT_RPATH
和DT_RUNPATH
(=使用ELF二进制文件的系统)的系统上,CMake变量CMake_INSTALL_RPATH
用于设置DT_RPATH
(或DT_RUNPATH
)标记的值,这些标记将在安装时写入二进制文件。中对此进行了解释
在Unix系统上,在系统定义的目录列表中搜索动态库。(/etc/ld.so.conf
——Windows所做的事情非常复杂,通常归结为“只需使用路径”
”;-)
如果在不在该列表中的自定义目录中安装库(如刚刚编译的库),则在运行依赖可执行文件时将找不到该库RPATH
是解决此问题的一种方法
有关详细信息,请参见上面链接的Wiki页面。首先,CMAKE_INSTALL_前缀确定头、库、可执行文件和其他资源的安装位置的“根” 在不支持依赖项“搜索层次”概念的系统上,不使用CMAKE_INSTALL_RPATH。但是,在基于ELF的系统(例如Linux)和基于Mach的系统(例如macOS 10.5和更高版本)上,可以在可执行文件和动态库(例如.so/.dylib文件)中设置一组额外的搜索位置;这是“Rpath”,您可以在cmake的安装阶段设置它,可以通过设置cmake_install_Rpath为所有目标设置,也可以通过在该目标上设置install_Rpath为单个目标设置 静态库不是动态的(显然!),所以CMAKE_INSTALL_RPATH对于静态库根本没有任何实用程序 安装动态对象时,如果CMake_SKIP_Rpath和CMake_SKIP_INSTALL_Rpath都为false,则CMake将把Rpath写入动态对象。默认情况下,写入的Rpath将设置为CMAKE_INSTALL_前缀,后跟库目标,例如CMAKE_INSTALL_前缀/lib。在Linux系统上,默认情况下会看到/usr/local/lib的Rpath被写成Rpath 您可以在Linux上检查Rpath,因此:
readelf -d libmylib.so
这会产生如下结果:
0x000000000000000f (RPATH) Library rpath: [/usr/local/lib]
cmd LC_RPATH
cmdsize 40
path @loader_path/../Frameworks (offset 12)
或在macOS上:
otool -l libmylib.dylib | grep -A 2 LC_RPATH
set(CMAKE_INSTALL_RPATH "@loader_path/../lib")
这会产生如下结果:
0x000000000000000f (RPATH) Library rpath: [/usr/local/lib]
cmd LC_RPATH
cmdsize 40
path @loader_path/../Frameworks (offset 12)
要覆盖install Rpath,可以设置变量CMAKE_install_Rpath。例如,在Linux上:
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")
或在macOS上:
otool -l libmylib.dylib | grep -A 2 LC_RPATH
set(CMAKE_INSTALL_RPATH "@loader_path/../lib")