构建C++项目遇Protobuf版本不兼容错误求助
Protobuf与gRPC版本不兼容构建错误排查
问题详情
- 构建C++项目时触发错误:
Protobuf C++ gencode is built with an incompatible version of. - 当前通过Homebrew安装的依赖版本:
brew info grpc ==> grpc: stable 1.62.2 (bottled), HEAD brew info protobuf ==> protobuf: stable 26.1 (bottled)
- CMake构建Protobuf的配置代码:
set(_GRPC_GRPCPP gRPC::grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) endif() # Gets the protos file path get_filename_component(PROTO_FILE "./proto/proto.proto" ABSOLUTE) get_filename_component(PROTO_FILE_PATH "${PROTO_FILE}" PATH) # Sets the location for generated files file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated/) set(PROTO_SOURCES "${CMAKE_BINARY_DIR}/generated/proto.pb.cc") set(PROTO_HEADERS "${CMAKE_BINARY_DIR}/generated/proto.pb.h") set(GRPC_SOURCES "${CMAKE_BINARY_DIR}/generated/proto.grpc.pb.cc") set(GRPC_HEADERS "${CMAKE_BINARY_DIR}/generated/proto.grpc.pb.h") set_property(SOURCE ${GRPC_SOURCES} ${PROTO_SOURCES} ${GRPC_HEADERS} ${PROTO_HEADERS} PROPERTY SKIP_AUTOMOC ON) # Generate *.pb.* and *.grpc.* files from .proto file add_custom_command ( OUTPUT "${PROTO_SOURCES}" "${PROTO_HEADERS}" "${GRPC_SOURCES}" "${GRPC_HEADERS}" COMMAND ${_PROTOBUF_PROTOC} ARGS --grpc_out "${CMAKE_BINARY_DIR}/generated/" --cpp_out "${CMAKE_BINARY_DIR}/generated/" -I "${PROTO_FILE_PATH}" --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" "${PROTO_FILE}" DEPENDS "${PROTO_FILE}" )
- 已尝试的解决操作:
brew uninstall --ignore-dependencies --force grpc opencv protobuf abseil brew cleanup brew autoremove brew install grpc opencv
- 附加错误信息(截图翻译):
致命错误:找不到'google/protobuf/stubs/common.h'文件
#include <google/protobuf/stubs/common.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
生成过程中出现1个错误。
解决方向
匹配gRPC与Protobuf兼容版本
gRPC 1.62.2官方兼容Protobuf 25.x系列,当前使用的26.1版本超出兼容范围,是核心冲突点。执行以下命令安装兼容版本:brew uninstall protobuf brew install protobuf@25 brew link protobuf@25 --force修正CMake依赖关联
在CMakeLists开头添加依赖查找与版本验证,确保关联正确库文件:find_package(Protobuf REQUIRED) find_package(gRPC REQUIRED) # 打印版本确认匹配 message(STATUS "Protobuf version: ${Protobuf_VERSION}") message(STATUS "gRPC version: ${gRPC_VERSION}")同时为目标程序添加正确的头文件路径与库链接:
add_executable(your_target ${PROTO_SOURCES} ${GRPC_SOURCES} 你的主代码文件.cpp) target_link_libraries(your_target ${_GRPC_GRPCPP} ${Protobuf_LIBRARIES} ) target_include_directories(your_target PRIVATE ${CMAKE_BINARY_DIR}/generated/ ${Protobuf_INCLUDE_DIRS} ${gRPC_INCLUDE_DIRS} )清理旧生成文件
之前生成的.pb.cc/.pb.h文件是用不兼容版本生成的,删除${CMAKE_BINARY_DIR}/generated/下所有文件后重新构建。排查多版本Protobuf冲突
检查系统中是否存在其他版本的Protobuf:which protoc protoc --version若版本不符,调整环境变量让Homebrew安装的版本优先:
echo 'export PATH="/usr/local/opt/protobuf@25/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
内容的提问来源于stack exchange,提问作者Lys4nder
相关产品推荐
相关产品推荐

