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

时间:2018-07-15 07:01:33

标签: protocol-buffers protobuf-c

我有一个用proto2语法编写的proto文件。我正在使用proto3编译器编译此proto文件。尽管成功建立连接,但在运行时显示以下错误。有人可以帮我吗。

  

[libprotobuf FATAL google / protobuf / extension_set.cc:102]类型为“ x.y.z.a”的多个扩展名注册,字段号200。   引发'google :: protobuf :: FatalException'实例后调用终止终止     what():类型为“ x.y.z.a”的多个扩展名注册,字段号200。

2 个答案:

答案 0 :(得分:1)

该错误表明,在某种程度上,您的程序具有此扩展定义的两个副本。这可能不是protoc的错,而是程序构建方式中的一些错误。

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

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

答案 1 :(得分:0)

听起来您有一条消息char *str_arr[] = { "one", "two", "three" }; qsort(str_arr, sizeof(str_array)/sizeof(char*), sizeof(char*), scmp); ,并且您在多个位置定义了ID为200的扩展名。

是这样的:

x.y.z.a

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