1

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

[libprotobuf FATAL google/protobuf/extension_set.cc:102] 类型“xyza”的多个扩展注册,字段编号 200。在抛出“google::protobuf::FatalException”实例后调用终止 what():多个扩展注册键入“xyza”,字段编号 200。

4

2 回答 2

1

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

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

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

于 2018-07-15T17:40:01.353 回答
0

听起来您有一条消息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;
}

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

于 2018-07-15T14:11:23.693 回答