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

CMAKE_BUILD_WITH_INSTALL_RPATH设为TRUE时protoc无法构建共享库问题

解决CMAKE_BUILD_WITH_INSTALL_RPATH导致protoc无法加载共享库的问题

问题原因

当你把CMAKE_BUILD_WITH_INSTALL_RPATH设为TRUE时,CMake会给生成的可执行文件(比如protoc)绑定安装路径的RPATH,但构建过程中,protobuf的共享库libprotocd.so还在你的${CMAKE_BINARY_DIR}/bin目录下,protoc找不到这个临时构建路径,就会抛出找不到共享库的错误。

解决方案

方案1:仅针对protobuf禁用BUILD_WITH_INSTALL_RPATH

如果你的全局项目需要保留CMAKE_BUILD_WITH_INSTALL_RPATH,可以单独给protobuf子项目关闭这个设置:

cmake_minimum_required(VERSION 3.20)
project(untitled4)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
option(BUILD_SHARED_LIBS "build shared libraries" ON)
option(BUILD_STATIC_LIBS "Build the static library" OFF)
include(FetchContent)
FetchContent_Declare(
        proto
        GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
        GIT_TAG        v21.6)

# 单独给protobuf子项目禁用BUILD_WITH_INSTALL_RPATH
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE CACHE INTERNAL "" FORCE)
FetchContent_MakeAvailable(proto)
# 恢复全局的BUILD_WITH_INSTALL_RPATH设置
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE CACHE INTERNAL "" FORCE)

add_executable(untitled4 main.cpp)

方案2:给RPATH添加构建阶段的库路径

如果必须保留全局的CMAKE_BUILD_WITH_INSTALL_RPATH,可以把构建时的库输出目录添加到RPATH中:

cmake_minimum_required(VERSION 3.20)
project(untitled4)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
# 添加构建阶段的库目录到INSTALL_RPATH
set(CMAKE_INSTALL_RPATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}:${CMAKE_INSTALL_RPATH}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
option(BUILD_SHARED_LIBS "build shared libraries" ON)
option(BUILD_STATIC_LIBS "Build the static library" OFF)
include(FetchContent)
FetchContent_Declare(
        proto
        GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
        GIT_TAG        v21.6)
FetchContent_MakeAvailable(proto)

add_executable(untitled4 main.cpp)

也可以单独给protoc设置RPATH:

# 在FetchContent_MakeAvailable之后添加
set_target_properties(protoc PROPERTIES
    INSTALL_RPATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
)

方案3:直接禁用全局的CMAKE_BUILD_WITH_INSTALL_RPATH

如果你的项目本身不需要这个全局设置,直接删掉或注释掉set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)这一行即可,CMake会自动使用构建阶段的临时RPATH,让protoc找到依赖的共享库。

内容的提问来源于stack exchange,提问作者Кирилл Волков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:01:52