关于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过程的改造。
➡️