代码之家  ›  专栏  ›  技术社区  ›  danish sodhi

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

  •  1
  • danish sodhi  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Kenton Varda    6 年前

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

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

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

        2
  •  0
  •   jpa    6 年前

    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;
    }
    

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