我正在尝试在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文件中使用我的选项,将公共部分移动到公共文件是很重要的。
答案 0 :(得分:2)
因为你有一个包 myext
你应该做的
import "myext/myext.proto";
myext.proto位于 myext 的子目录中。
在协议缓冲区包中指示文件应该驻留的目录(如在java中)
答案 1 :(得分:0)
由于您已使用新的原始文件制作了一个新程序包,因此需要引用该程序包的名称空间。
正如您在评论中指出的那样,只需使用“((myext.myopt)””而不是“(myopt)”,这样就可以了:
未更改显示的内容
package myext;
import "google/protobuf/descriptor.proto";
extend google.protobuf.FieldOptions {
optional int32 myopt = 70000;
}
将“(myopt)”替换为“(myext.myopt)”
import "google/protobuf/descriptor.proto";
import "myext.proto";
package tutorial;
message Persona {
required string name = 1 [(myext.myopt)=5];
}