我试图在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:
#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版本:
#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,
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,通过
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?
发布于 2019-04-01 17:38:15
这是通过从tensorflow/工作区文件中删除以下外部依赖包来解决的:
# load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
# closure_repositories()
原因是closure_repositories使用Protobuf3.5,因为3.6需要g++11,而这并不是通用的。
https://stackoverflow.com/questions/55290443
复制相似问题