bazel tensorflow协议版本不匹配

时间:2019-03-21 22:56:30

标签: tensorflow bazel protoc

我试图在tensorflow r1.12.0(gcc版本4.8.5 20150623(Red Hat 4.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

因此不兼容。

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

cc_proto_library(
    name = "example_cc_protos",
    deps = [":example_protos"],
)

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

我的pip / protobuf显示版本3.6.1,而protoc --version也显示版本3.6.1,因此我怀疑bazel本身中的protobuf必须是版本3.5,导致上述不幸的硬编码为3005000。

我发现protobuf 3.6.1自bazel 0.17开始可用; similar link for bazel 0.16给了我404。因此,我尝试使用GitHub上的预安装安装程序安装bazel 0.17。但是令人惊讶的是,生成的pb.h文件仍然具有3005000原始版本的硬编码。

然后我尝试通过

从源头构建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文档说tf 1.12已通过bazel 0.15进行了测试: enter image description here

最后,如果我直接使用protoc构建.proto文件,则在pb.h文件中确实会得到3006001,只是为了表明我正确安装了protoc。

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

1 个答案:

答案 0 :(得分:0)

此问题已解决,方法是从 tensorflow / WORKSPACE文件:

# load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")

# closure_repositories()

原因是closure_repositories使用protobuf 3.5,因为3.6需要g ++ 11,而后者并不是通用的。