构建gRPC共享库时出现链接错误,静态库构建正常
解决gRPC构建共享库时protoc动态库依赖错误
问题原因
开启BUILD_SHARED_LIBS=ON构建gRPC共享库时,生成的protoc工具会动态链接到libprotocd.so.32,但CMake执行内部add_custom_command脚本时,系统动态库搜索路径(LD_LIBRARY_PATH)不包含gRPC构建产出的共享库目录,导致protoc运行时找不到依赖库。
解决方案
方法1:强制让protobuf静态构建(推荐)
protoc作为构建工具,静态链接可彻底规避动态库依赖问题。在FetchContent_MakeAvailable(grpc)前添加以下配置:
option(BUILD_SHARED_LIBS "build shared libraries" ON) include(FetchContent) # 强制protobuf构建静态库,关闭测试以加快构建 set(protobuf_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) set(protobuf_BUILD_TESTS OFF CACHE BOOL "" FORCE) FetchContent_Declare( grpc GIT_REPOSITORY https://github.com/grpc/grpc.git GIT_TAG v1.49.1) set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(grpc)
方法2:设置构建RPATH让protoc找到依赖库
通过CMake的RPATH机制,让生成的protoc自动查找相邻目录的共享库:
option(BUILD_SHARED_LIBS "build shared libraries" ON) include(FetchContent) # 配置RPATH,让程序从自身目录的上级lib目录找库 set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) set(CMAKE_BUILD_RPATH "$ORIGIN/../lib") FetchContent_Declare( grpc GIT_REPOSITORY https://github.com/grpc/grpc.git GIT_TAG v1.49.1) set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(grpc)
方法3:临时设置LD_LIBRARY_PATH
针对protoc的执行命令,临时注入动态库搜索路径:
option(BUILD_SHARED_LIBS "build shared libraries" ON) include(FetchContent) FetchContent_Declare( grpc GIT_REPOSITORY https://github.com/grpc/grpc.git GIT_TAG v1.49.1) set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(grpc) # 获取protobuf库目录并更新环境变量 get_target_property(PROTOBUF_LIB_LOCATION protobuf::libprotoc LOCATION) get_filename_component(PROTOBUF_LIB_DIR ${PROTOBUF_LIB_LOCATION} DIRECTORY) set(ENV{LD_LIBRARY_PATH} "${PROTOBUF_LIB_DIR}:$ENV{LD_LIBRARY_PATH}")
验证
重新执行CMake配置和构建命令,protoc将能正确找到依赖库,完成gRPC共享库的构建。
内容的提问来源于stack exchange,提问作者Кирилл Волков
相关产品推荐
相关产品推荐

