我有一个原型文件,用协议2语法编写。我正在使用协议3编译器编译这个原型文件。虽然它成功构建,但它在运行时显示以下错误。有人能帮我吗?
[libprotobuf FATAL google/protobuf/extension\u set.cc:102]x.y.z.a类型的多个扩展注册,字段号200。在抛出“google::protobuf::FatalException”what():type“x.y.z.a”字段号200的多个扩展注册的实例后调用terminate。
该错误表明,不知何故,您的程序有两个此扩展的定义副本。这可能不是protoc的错,而是程序构建方式中的一些错误。
这是我的理论:你的proto文件已经被分别编译并链接到两个不同的组件/库中,然后它们都被加载到同一个程序中。其中一个组件是你的,另一个是共享相同协议的其他人的。另一个组件之前已经在使用Pro buf 3.5.1,但你的使用2.3.0。这意味着你的程序中实际上有两个libPro buf的副本。因此,扩展的两个副本是使用不同的libpro buf副本加载的,因此没有错误。但是现在您已经将您的组件切换到使用Pro buf 3.5.1,因此现在只加载了一个libPro buf副本,并且两个proto文件副本都被加载到那个libpro buf副本中。所以现在,你得到了一个错误。
要解决这个问题,您需要确保您的程序只包含每个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;
}
因此,请检查这些重复的扩展名,它们可以在多个文件中定义。