You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确理解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)

效果说明

  1. 构建阶段运行:
    进入build目录执行cmake .. && make后,直接运行./bin/my_app,程序会自动通过CMAKE_BUILD_RPATH找到build/lib/libutils.so,无需手动设置LD_LIBRARY_PATH。

  2. 安装后运行:
    执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:15:48