提问者:小点点

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


我有一个原型文件,用协议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。


共2个答案

匿名用户

该错误表明,不知何故,您的程序有两个此扩展的定义副本。这可能不是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;
}

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