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,提问作者Кирилл Волков
相关产品推荐
相关产品推荐

