生成gRPC客户端.so文件遭遇Protocol Buffer版本不兼容错误求助
在Linux 20.4系统下用C++开发gRPC客户端,想要生成.so文件供其他函数调用。在CMakeLists.txt末尾添加add_library(client_lib client.cc)后,编译出现版本不兼容错误:
cmake/build/stringreverse.grpc.pb.h:7,
from /home/client.cc:3:
/cmake/build/stringreverse.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
12 | #error This file was generated by a newer version of protoc which is
/cmake/build/stringreverse.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
13 | #error incompatible with your Protocol Buffer headers. Please update
/cmake/build/stringreverse.pb.h:14:2: error: #error your headers.
未添加该语句时,客户端可执行文件编译正常。相关版本信息:
# 系统安装的Protobuf头文件版本 grep GOOGLE_PROTOBUF_VERSION /usr/include/google/protobuf/stubs/common.h #define GOOGLE_PROTOBUF_VERSION 3012004 #define GOOGLE_PROTOBUF_VERSION_SUFFIX "" GOOGLE_PROTOBUF_VERSION, GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION, # 本地protoc版本 protoc --version libprotoc 3.21.6
- 版本不匹配:生成proto文件的protoc版本(3.21.6)远高于系统安装的Protobuf头文件版本(3.12.4),生成的
.pb.h文件内置版本检查逻辑,触发编译错误。 - 目标配置缺失:新增的
client_lib库目标未关联proto生成的源文件,也未链接gRPC/Protobuf依赖库,导致编译时调用了系统旧版本的Protobuf头文件。
1. 修正CMakeLists.txt核心配置
将原来的add_library(client_lib client.cc)替换为以下代码,确保库目标关联所有必要的源文件和依赖:
# 生成动态库(如需静态库,将SHARED改为STATIC) add_library(client_lib SHARED client.cc ${hw_proto_srcs} ${hw_grpc_srcs}) # 链接gRPC和Protobuf依赖库 target_link_libraries(client_lib ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF} ) # 确保库目标能找到生成的proto头文件 target_include_directories(client_lib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} )
2. 统一Protobuf版本(可选但推荐)
如果系统安装的Protobuf版本过低,可指定CMake使用本地安装的高版本Protobuf(即生成proto文件的protoc对应的库)。在find_package(Protobuf CONFIG REQUIRED)前添加以下配置:
# 指定本地高版本Protobuf的安装路径(根据实际路径调整) set(Protobuf_ROOT "/usr/local") set(Protobuf_PROTOC_EXECUTABLE "/usr/local/bin/protoc") set(protobuf_MODULE_COMPATIBLE TRUE)
3. 重新编译
删除原build目录,重新执行编译流程:
rm -rf cmake/build mkdir -p cmake/build && cd cmake/build cmake .. make
执行完成后,即可在build目录下生成libclient_lib.so文件。
内容的提问来源于stack exchange,提问作者sama

