多个原型中的 FileOptions 扩展
Posted
技术标签:
【中文标题】多个原型中的 FileOptions 扩展【英文标题】:FileOptions extension in multiple protos 【发布时间】:2019-04-11 07:49:36 【问题描述】:我正在尝试使用 FileOptions 来利用文件级扩展来对一些 proto 文件进行版本控制。
我创建了以下文件:
Version.proto
import "google/protobuf/descriptor.proto";
extend google.protobuf.FileOptions
string version = 50001;
我有两个额外的 protos 导入 Version.proto 并使用 option(version) 扩展:
A.proto
import "Version.proto";
option (version) = "1.0.1";
B.proto
import "Version.proto";
option (version) = "1.0.1";
我用 protoc.exe 编译 proto 文件并链接 libprotobufd.dll。当我运行使用 A & B 文件的应用程序时,出现以下错误:
[libprotobuf FATAL google\protobuf\extension_set.cc:102] 类型 google.protobuf.FileOptions 的多个扩展注册,字段编号 50001。
【问题讨论】:
【参考方案1】:如果不知道您的项目是如何构建/编译的,我无法说出它是如何发生的,但是您不知何故不止一次地使用了字段编号 50001。仔细检查数字 50001 是否只在您的项目中出现一次。如果您有多个 FileOptions 消息浮动,它们都共享相同的消息扩展字段编号。
如果您确定自己没有注册两次50001
,请尝试切换到像78354
这样的随机名称,看看问题是否仍然存在。
【讨论】:
我尝试了不同的数字但没有帮助。据我了解这个问题,当 Version.proto 被导入时,第一次在 A.proto 中保留号码,然后在 B.proto,在导入期间也是如此。 我的设置:C++ VS 2017,protobuf 版本 3.4.0。 Protos 由 protoc.exe 编译,输出文件包含在项目中。 Protobuf.dll 动态链接。 @GrzesiekMal 你是在同时编译它们吗? 是的,一次完成。该问题在此处有更多详细信息:github.com/protocolbuffers/protobuf/issues/6029以上是关于多个原型中的 FileOptions 扩展的主要内容,如果未能解决你的问题,请参考以下文章
使用 FileOptions.DeleteOnClose 创建文件,写入文件并在之后看到它被删除
尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”