使用proto3编译器编译proto2语法文件



我有一个用proto2语法编写的proto文件。我正在使用proto3编译器编译这个proto文件。尽管它构建成功,但在运行时会显示以下错误。有人能帮帮我吗?

[libprotobuf FATAL google/protobuf/extension_set.cc:102]类型"x.y.z.a"的多个扩展注册,字段号200。在引发"google::protobuf::FatalException"的实例后调用了terminatewhat((:类型"x.y.z.a"的多个扩展注册,字段号为200。

错误表明,不知何故,您的程序有两个该扩展定义的副本。这可能不是protoc的错,而是程序构建过程中的一些错误。

这是我的理论:您的proto文件已经被单独编译并链接到两个不同的组件/库中,然后这两个组件/库都被加载到同一个程序中。其中一个组件是您的,另一个是共享相同协议的其他组件。另一个组件以前已经使用protobuf 3.5.1,但您的组件使用的是2.3.0。这意味着您的程序中实际上有两个libprotobuf副本。因此,扩展的两个副本是使用libprotobuf的不同副本加载的,因此没有错误。但现在您已经将组件切换为使用protobuf 3.5.1,因此现在只有一个libprotobuf副本被加载,并且proto文件的两个副本都被加载到libprotobuf的一个副本中。所以现在,你得到了一个错误。

要解决这个问题,您需要确保您的程序包含每个proto文件的一个编译副本。如果两个组件需要共享一个协议,那么需要将该协议分解为一个单独的组件来共享。

听起来您有一条消息x.y.z.a,并且您在多个位置定义了一个id为200的扩展。

这样的东西:

package x.y.z;
message a {
extensions 200 to 255;
}
extend a {
optional int32 foo = 200;
}
extend a {
optional int32 bar = 200;
}

因此,请检查这些重复的扩展名,这些扩展名可以在多个文件中定义。

最新更新