在导入的.proto文件中扩展protobuf.FieldOptions

时间:2013-06-15 17:39:38

标签: c++ protocol-buffers

我正在尝试在google协议缓冲区中定义自定义字段选项。如果我创建这样的文件,一切正常:

import "google/protobuf/descriptor.proto";

package tutorial;

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}

message Persona {
  required string name = 1 [(myopt)=5];
}

但是,如果我尝试将“myopt”定义移动到另一个文件,则编译失败:

myext.proto:

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}

addressbook.proto:

import "google/protobuf/descriptor.proto";
import "myext.proto";

package tutorial;


message Persona {
  required string name = 1 [(myopt)=5];
}

汇编

$ protoc --cpp_out=. -I/usr/include -I. addressbook.proto
addressbook.proto:8:29: Option "(myopt)" unknown.

有没有办法在其他文件中定义自定义字段选项而不是使用它的文件?如果我想在几个.proto文件中使用我的选项,将公共部分移动到公共文件是很重要的。

2 个答案:

答案 0 :(得分:2)

因为你有一个包 myext

你应该做的

import "myext/myext.proto";

myext.proto位于 myext 子目录中。

在协议缓冲区包中指示文件应该驻留的目录(如在java中)

答案 1 :(得分:0)

由于您已使用新的原始文件制作了一个新程序包,因此需要引用该程序包的名称空间。

正如您在评论中指出的那样,只需使用“((myext.myopt)””而不是“(myopt)”,这样就可以了:

myext.proto:

未更改显示的内容

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}

addressbook.proto:

将“(myopt)”替换为“(myext.myopt)”

import "google/protobuf/descriptor.proto";
import "myext.proto";

package tutorial;


message Persona {
  required string name = 1 [(myext.myopt)=5];
}