什么';CMAKE_INSTALL_前缀和CMAKE_INSTALL_RPATH之间的区别是什么

什么';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

我很难理解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
            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")