CMake构建macOS动态库时如何禁用RPATH并改用@executable_path
CMake配置macOS动态库install name的实现方案
完全可以通过CMake原生配置在构建流程中直接实现动态库库标识的修改,无需构建完成后手动执行install_name_tool操作。
实现原理
macOS平台下,动态库的标识(也就是otool -L查询到的库自身路径记录)是在链接阶段通过-install_name参数写入二进制头的。CMake默认会为构建生成的动态库自动追加@rpath作为标识前缀,我们只需要在CMake配置中显式指定目标的相关属性,就能控制链接阶段的写入值。
具体配置
在原有的CMakeLists.txt基础上,为simpleLibrary目标追加属性配置即可,修改后的完整配置如下:
cmake_minimum_required(VERSION 3.11) project(simpleLibrary) set(CMAKE_CXX_STANDARD 17) add_library(simpleLibrary SHARED main.cpp) # 配置动态库标识为@executable_path前缀 set_target_properties(simpleLibrary PROPERTIES # 指定动态库的install name路径,替换默认的@rpath前缀 INSTALL_NAME_DIR "@executable_path" # 让构建目录下的产物直接使用上述install name配置 BUILD_WITH_INSTALL_RPATH ON )
配置项说明
INSTALL_NAME_DIR "@executable_path":直接指定动态库自身标识的路径前缀,CMake会在链接阶段自动传递对应的-install_name参数到编译器,最终生成的dylib标识会直接使用该路径BUILD_WITH_INSTALL_RPATH ON:该配置为必要项——CMake默认对未执行安装的构建目录产物,会使用内置的构建期rpath规则生成动态库标识,开启该开关后,构建阶段生成的dylib会直接套用你配置的INSTALL_NAME_DIR值,不会默认追加@rpath前缀
效果验证
完成配置后重新编译,再次进入cmake-build-debug目录执行otool -L libsimpleLibrary.dylib,输出的第一行库标识就会变为:
libsimpleLibrary.dylib: @executable_path/libsimpleLibrary.dylib (compatibility version 0.0.0, current version 0.0.0)
和手动执行install_name_tool -id @executable_path/libsimpleLibrary.dylib的修改效果完全一致,且全程在CMake构建流程内完成,无需额外的后处理脚本。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

