CMAKE_INSTALL_PREFIX和CMAKE_INSTALL_RPATH之间有什么区别

时间:2015-08-17 10:12:53

标签: cmake

我很难理解CMAKE_INSTALL_PREFIX和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的重点是什么?

3 个答案:

答案 0 :(得分:5)

在支持c:/ABC/DEF形式(即Windows)路径的系统上,没有。 Windows二进制文件没有rpath的概念。

在具有DT_RPATHDT_RUNPATH(=使用ELF二进制文件的系统)的系统上,CMake变量CMAKE_INSTALL_RPATH用于设置DT_RPATH的值(或DT_RUNPATH)标签,将在安装时写入二进制文件。

答案 1 :(得分:4)

CMake RPATH handling解释了这一点。

在Unix系统上,在系统定义的目录列表中搜索动态库。 (/etc/ld.so.conf - Windows执行此操作in its own way如此复杂,通常归结为“只使用PATH”.;-))

如果您在不在该列表中的自定义目录中安装库(如刚刚编译的库),则在运行从属可执行文件时将找不到该库。 RPATH是解决此问题的一种方法。

有关详细信息,请参阅上面链接的Wiki页面。

答案 2 :(得分:0)

首先,CMAKE_INSTALL_PREFIX确定标题,库,可执行文件和其他资源的安装位置的“根”。

在不支持依赖关系的“搜索层次”概念的系统上,不使用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都为假,CMake会将Rpath写入动态对象。默认情况下,写入的Rpath将设置为CMAKE_INSTALL_PREFIX,后跟库目标,例如CMAKE_INSTALL_PREFIX / lib目录下。在Linux系统上,默认情况下会看到/ usr / local / lib的Rpath写为Rpath。

您可以检查Linux上的Rpath:

readelf -d libmylib.so

产生类似的东西:

0x000000000000000f (RPATH)              Library rpath: [/usr/local/lib]

或在macOS上:

otool -l libmylib.dylib | grep -A 2 LC_RPATH

产生类似的东西:

          cmd LC_RPATH
      cmdsize 40
         path @loader_path/../Frameworks (offset 12)

要覆盖安装Rpath,可以设置变量CMAKE_INSTALL_RPATH。例如。在Linux上:

set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")

或在macOS上:

set(CMAKE_INSTALL_RPATH "@loader_path/../lib")