如何正确理解CMAKE_BUILD_RPATH与CMAKE_INSTALL_RPATH的差异?
理解CMAKE_BUILD_RPATH与CMAKE_INSTALL_RPATH的核心差异
核心区别
这两个变量都是用来指定程序运行时的库搜索路径(RPATH),但作用阶段完全不同:
- CMAKE_BUILD_RPATH:仅针对构建目录下的未安装二进制文件。编译完成后直接在构建目录运行程序时,会用这个路径找依赖库,不会影响安装后的文件。
- CMAKE_INSTALL_RPATH:仅针对安装到目标目录后的二进制文件。执行
install操作后,程序会用这个路径找依赖库,和构建阶段的路径无关。
简洁示例
假设项目结构如下:
my_project/ ├── src/main.c # 主程序,依赖utils库 ├── lib/utils.c # 自定义库 ├── build/ # 构建目录(cmake生成的文件放这) └── install/ # 安装目标目录
对应的CMakeLists.txt配置:
cmake_minimum_required(VERSION 3.8) project(my_project) # 1. 设置构建阶段的RPATH:让build下的可执行文件找build/lib里的库 set(CMAKE_BUILD_RPATH "${PROJECT_BINARY_DIR}/lib") # 2. 设置安装阶段的RPATH:让安装后的可执行文件找install/lib里的库 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") # 编译自定义库utils add_library(utils SHARED lib/utils.c) # 指定库的构建输出目录为build/lib set_target_properties(utils PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib" ) # 安装库到install/lib install(TARGETS utils DESTINATION lib) # 编译主程序my_app add_executable(my_app src/main.c) target_link_libraries(my_app utils) # 指定可执行文件的构建输出目录为build/bin set_target_properties(my_app PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin" ) # 安装程序到install/bin install(TARGETS my_app DESTINATION bin)
效果说明
构建阶段运行:
进入build目录执行cmake .. && make后,直接运行./bin/my_app,程序会自动通过CMAKE_BUILD_RPATH找到build/lib/libutils.so,无需手动设置LD_LIBRARY_PATH。安装后运行:
执行cmake --install build --prefix ../install,然后进入install/bin运行./my_app,程序会通过CMAKE_INSTALL_RPATH找到../install/lib/libutils.so,即使install/lib不在系统默认的库搜索路径中也能正常运行。
补充说明
如果需要给单个目标单独设置RPATH(而不是全局生效),可以用set_target_properties修改目标的BUILD_RPATH或INSTALL_RPATH属性,比如:
set_target_properties(my_app PROPERTIES BUILD_RPATH "${PROJECT_BINARY_DIR}/custom_lib" )
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

