如何设置多目录的CMAKE_INSTALL_RPATH并对所有目标生效
CMake 全局多路径 RPATH 配置方案
正确的全局配置方法
你需要的全项目(含子项目)统一RPATH配置不需要逐个对目标调用set_target_properties,CMake原生提供了全局生效的配置变量,正确写法如下:
# 第一步:提前开启安装时RPATH设置开关(必须放在所有目标定义前) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # macOS 平台需额外添加这一行兼容 set(CMAKE_MACOSX_RPATH TRUE) # 第二步:设置多路径RPATH,直接用空格分隔多个路径,CMake会自动生成分号分隔的列表 set(CMAKE_INSTALL_RPATH "/opt/my/lib" "/other/lib")
注意:上述所有配置必须放在
add_executable、add_library等目标定义语句,以及add_subdirectory加载子项目的语句之前,已经创建的目标不会继承后续设置的全局变量。
之前配置不生效的常见原因
- 配置顺序错误:全局RPATH变量设置在了目标定义或子项目加载之后
- 未开启
CMAKE_INSTALL_RPATH_USE_LINK_PATH开关,部分Linux发行版、macOS默认会禁用安装阶段的RPATH自动设置 - 写法错误:不要用冒号分隔多路径,CMake内部用分号作为列表分隔符,直接空格传多个路径参数即可自动生成合法列表
全目标覆盖兜底方案
如果存在子项目提前定义目标、或子项目强制覆盖RPATH的场景,可以用以下脚本实现你想要的批量设置所有目标的效果:
# 获取当前构建系统中所有已定义的目标 get_property(all_targets GLOBAL PROPERTY BUILDSYSTEM_TARGETS) # 遍历所有目标统一设置INSTALL_RPATH foreach(target ${all_targets}) set_target_properties(${target} PROPERTIES INSTALL_RPATH "/opt/my/lib;/other/lib" ) endforeach()
内容的提问来源于stack exchange,提问作者Evandro Coan
相关产品推荐
相关产品推荐

