我很难理解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的重点是什么?
答案 0 :(得分:5)
在支持c:/ABC/DEF
形式(即Windows)路径的系统上,没有。 Windows二进制文件没有rpath的概念。
在具有DT_RPATH
和DT_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")