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

C++ 在导入的.proto文件中扩展protobuf.FieldOptions,c++,protocol-buffers,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]; } 但是,如果我尝

我试图在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;
}
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.
addressbook.proto:

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}
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.
编译:

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}
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文件中使用我的选项,将公共部分移动到公共文件是很重要的。

因为您有一个包myext

你应该做什么

import "myext/myext.proto";
myext.proto位于myext子目录中


In-protocol buffer package表示文件应该驻留的目录(如java中)

因为您已经用新的proto文件创建了一个新的包,所以需要引用包的名称空间

正如您在评论中所指出的,只需使用“(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)”


这并不能解决问题。然而,你给了我一个暗示,“包”在这里有一些影响,它导致了一个真正的解决方案(见对我问题的评论)。这个答案是不正确的。
.proto
文件中声明的包名不需要与目录结构有任何关系。它们通常匹配,但这只是惯例,不是要求。如果我使用“(myext.myopt)”而不是“(myopt)”,一切都可以。是的,这正是我在评论中写的:)