首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bazel tensorflow原型错配

bazel tensorflow原型错配
EN

Stack Overflow用户
提问于 2019-03-21 22:56:29
回答 1查看 1.5K关注 0票数 1

我试图在tensorflow 1.12.0 (gcc版本4.8.5 20150623 (RedHat4.8.5-36)(GCC)中)内的bazel中构建一个自定义协议缓冲区,但始终遇到以下错误消息

此文件是由一个新版本的protoc生成的,它与您的协议缓冲区头不兼容。请更新您的标题。

在仔细检查上述错误的原因后,我直接查看了bazel-genfiles,发现对于先前存在的pb.h文件,例如examples.pb.h,硬编码的bazel版本是3.6.0:

代码语言:javascript
运行
复制
#if GOOGLE_PROTOBUF_VERSION < 3006000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3006000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

但是对于我自己的自定义协议缓冲区的pb.h文件,它显示了3.5版本:

代码语言:javascript
运行
复制
#if GOOGLE_PROTOBUF_VERSION < 3005000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

因此,不相容。

实际上,如果我自己通过这样的examples.proto规则构建cc_proto_library,

代码语言:javascript
运行
复制
cc_proto_library(
    name = "example_cc_protos",
    deps = [":example_protos"],
)

我还在生成的examples.pb.h文件中看到了版本3005000,因此上面的3006000 pb.h文件可能是从远程源下载的。

我的pip/protobuf显示了3.6.1版本,而protoc也显示了3.6.1,因此我怀疑bazel内部的protobuf必须是3.5版本,这导致了上述3005000的不幸硬编码。

我发现Protobuf3.6.1在巴泽尔0.17之后就可用了;bazel 0.16的类似链接给了我一个404。因此,我尝试在GitHub上使用预置安装程序安装Bazel0.17。但令人惊讶的是,生成的pb.h文件仍然有3005000 proto版本硬编码。

然后,我尝试从消息来源构建bazel,通过

代码语言:javascript
运行
复制
git clone https://github.com/bazelbuild/bazel.git
cd bazel
bazel build //src:bazel
alias bazel=bazel-bin/src/bazel

但这仍然给了我同样的错误。

我还尝试了多个版本的bazel,从0.15.x到0.18.x;更高的版本无法构建tensorflow_model_server,所以我没有尝试。它们的结果都是由cc_proto_library bazel规则构建的pb.h值为3005000。

官方的tensorflow doc说tf 1.12用bazel 0.15进行了测试:

最后,如果我使用protoc直接构建.proto文件,那么我确实在pb.h文件中获得了3006001,这仅仅是为了证明我正确地安装了protoc。

,我的问题是,pb.h文件中的3005000来自哪里?是gcc,bazel,tensorflow,protoc,还是pip/protobuf?

EN

回答 1

Stack Overflow用户

发布于 2019-04-01 17:38:15

这是通过从tensorflow/工作区文件中删除以下外部依赖包来解决的:

代码语言:javascript
运行
复制
# load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")

# closure_repositories()

原因是closure_repositories使用Protobuf3.5,因为3.6需要g++11,而这并不是通用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55290443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档