问题描述
我们的项目中会引用到各种sdk,项目代码和sdk中都有可能会使用protobuf。当protobuf版本不一致时,编译就会报错。有两种可能的报错信息
This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer headers. Please update your headers.
This file was generated by an older version of protoc which is incompatible with your Protocol Buffer headers. Please regenerate this file with a newer version of protoc.
这两类报错的可以归结为一类,就是该被include进去的头文件(*.pb.h)同依赖的protobuf的环境版本不一致。
Protobuf环境
我们先来看一下protobuf自身的环境。Bin文件夹(protoc工具,用于将业务自身的proto文件翻译成代码);include文件夹(google protobuf自带的头文件,被前者所依赖);lib文件夹(静态包或动态包,项目链接时会用到)。
一种错误情形
项目所依赖的sdk中,自带了业务的*.pb.h文件,这个文件是和项目所使用的不同版本的protoc所生成的。而在编译时,这些*.pb.h和*.pb.cc文件会include项目自带的google protobuf的头文件。当这两者的版本出现不一致时,就会报上述的错误。
如何解决
一种解决方案就是所有的sdk都需要上传*.proto文件,项目在编译时,强制使用项目自身依赖的protoc工具,生成sdk中的*.pb.h和*.pb.cc文件。这样就能保证项目引用sdk被强制同自身使用的protobuf版本保持一致。