如何校验protoc版本是否与系统安装的libprotobuf版本一致
protoc与libprotobuf版本匹配问题解答
首先给出明确结论:动态库后缀标注的23不等同于protoc的3.12版本,二者属于两套独立的版本计数规则,不能通过数字直接比对判断是否匹配。
protoc --version输出的3.12.4是Protobuf官方对外的语义化发布版本号,对应编译器的功能迭代版本- 动态库后缀的
.23是libprotobuf的ABI兼容版本(SONAME),仅在库的二进制调用接口发生不兼容变更时才会递增,和语义化版本号没有固定的数字换算关系。巧合的是Protobuf 3.12.x系列对应的SONAME版本恰好是23,但这只是版本迭代过程中的个例,不能作为通用判断依据。
正确校验版本是否匹配的方法
1. 直接读取动态库内置的版本信息
libprotobuf在编译时会把自身的语义化版本字符串写入二进制文件,直接执行以下命令提取即可:
strings /usr/lib/x86_64-linux-gnu/libprotobuf.so.23.0.4 | grep -E "^libprotobuf [0-9]+\.[0-9]+\.[0-9]+"
如果库和protoc版本匹配,命令输出的版本号会和protoc --version的输出完全一致,对应3.12.4版本的库会输出libprotobuf 3.12.4。
2. 确认protoc实际链接的库路径
多数版本不匹配问题都是系统内安装了多套Protobuf导致的,先执行命令确认protoc运行时加载的到底是哪个路径下的libprotobuf:
ldd $(which protoc) | grep libprotobuf
如果输出的库路径不是你通过locate找到的/usr/lib/x86_64-linux-gnu/libprotobuf.so.23,说明你locate到的库根本不是当前protoc在使用的库,二者没有比对意义。
版本不匹配的常见影响
如果校验后发现二者版本不匹配,通常会出现以下问题:
- protoc生成的C++代码编译时直接报错,提示Protobuf版本不匹配
- 程序运行时出现序列化/反序列化结果异常、段错误崩溃
- 代码链接阶段出现大量libprotobuf相关的未定义引用错误
内容的提问来源于stack exchange,提问作者Nicholas Jela
相关产品推荐
相关产品推荐

