多个原型中的 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 扩展的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript扩展原型链浅析

使用 FileOptions.DeleteOnClose 创建文件,写入文件并在之后看到它被删除

构造函数中的“使用严格”是不是扩展到原型方法?

构造函数中的“使用严格”是不是扩展到原型方法?

将函数传递给其他原型

尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”