关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题

💡 原文中文,约6500字,阅读约需16分钟。
📝

内容提要

升级protobuf和gRPC版本时遇到链接和符号未定义问题,通过修改声明和补充符号解决。问题包括InternalMetadata::~InternalMetadata()未定义和默认instance符号未定义。gRPC问题包括链接符号和编译器兼容性问题,已通过补丁修复。

🎯

关键要点

  • 项目组在构建系统中将protobuf升级到v20/v3.20和gRPC升级到v1.54,遇到符号未定义问题。

  • protobuf的符号未定义问题主要包括InternalMetadata析构函数未定义,已在v22/v4.22版本修复。

  • 在Debug模式下,某些编译器可能会优化掉InternalMetadata析构符号,导致链接失败。

  • 默认instance符号未定义的问题存在于v21/v3.21到v23/4.23版本,需要在动态库中设置导出符号。

  • gRPC v1.54.0版本中,constexpr变量可能被inline,导致链接符号未定义,已在v1.54.2修复。

  • 部分编译器对std::unique_ptr的支持存在问题,临时解决方案是使用shared_ptr。

  • 后续针对protobuf v22+和gRPC v1.55+的重大变化将导致Patch过程的改造。

➡️

继续阅读