TensorFlow protobuf版本不匹配

时间:2017-09-15 08:44:55

标签: c++ tensorflow protocol-buffers

我通过virtualenv安装了TensorFlow。它运作良好。

现在我想用C ++加载模型并做预测。但由于protobuf版本不匹配,我无法编译我的程序。错误如:

tensorflow/core/framework/device_attributes.pb.h:17:2: error: #error This file was generated by an older version of protoc which is
 #error This file was generated by an older version of protoc which is
  ^
tensorflow/core/framework/device_attributes.pb.h:18:2: error: #error incompatible with your Protocol Buffer headers. Please
 #error incompatible with your Protocol Buffer headers.  Please
  ^
tensorflow/core/framework/device_attributes.pb.h:19:2: error: #error regenerate this file with a newer version of protoc.
 #error regenerate this file with a newer version of protoc.

在virtualenv:

$ pip show protobuf
Name: protobuf
Version: 3.4.0
Summary: Protocol Buffers

在shell中:

$ protoc --version
libprotoc 3.4.0

我以前在我的环境中有protobuf-2.6.1但现在升级到3.4.0

ubuntu 16.04

3 个答案:

答案 0 :(得分:6)

问题是TensorFlow编译过程使用了自己的协议缓冲区分布。从TensorFlow v1.3.0开始,此分发是协议缓冲区3.3.0。如果您想将自己的C ++代码与TensorFlow生成的标题混合使用,则需要使用完全相同的版本(或者只是使用脚本来使用Bazel下载的分发版)。

另一种方法是从原始邮件描述文件中使用您自己的protoc生成自己的标头。

编辑:

TensorFlow使用的库的版本目前(TF v1.9)在tensorflow/workspace.bzl中定义。原则上,应该可以生成TensorFlow的自定义构建,其中包含特定的所需版本的库,只要它与TensorFlow和其他所有依赖项兼容(请注意,由于源中解释的原因,是协议缓冲区的三个HTTP存档,protobuf_archivecom_google_protobufcom_google_protobuf_cc,因此您需要修改其中的三个。)

答案 1 :(得分:0)

请使用与tensorflow相同的版本重新编译原型文件。如果您使用tensorflow/tensorflow/contrib/makefile/gen/protobuf/bin/protoc从源代码构建tensorflow,则会在build_all_linux.sh中找到它。

答案 2 :(得分:0)

有一个类似的问题,我努力解决:编译脚本总是能够在某个地方找到protoc的过时版本。

检查协议位置:

which protoc # /usr/bin/protoc
sudo apt-get uninstall protobuf-compiler
conda uninstall protobuf
conda uninstall libprotobuf
exit # resign in

,这意味着存在协议二进制文件/usr/bin/protoc和头文件/usr/include/google/protoc。删除协议安装不一定会删除包含文件夹中的头文件,这会导致重新包装错误。如果您在安装protobuf之后仍然看到错误,请尝试清洁每个protobuf位置的包含文件。

之后,可以随意下载适合您平台的二进制文件(在我的情况下是protoc-3.10.1-linux-x86_64.zip)并将其放置在方便的位置:

mkdir ~/tmp/
cd ~/tmp
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.10.1/protoc-3.10.1-linux-x86_64.zip
sudo rm -rf ./protoc
unzip protoc-3.10.1-linux-x86_64.zip -d protoc
chmod 755 -R protoc
BASE=/usr/local
sudo rm -rf $BASE/include/google/protobuf/
sudo cp protoc/bin/protoc $BASE/bin 
sudo cp -R protoc/include/* $BASE/include 

在解决问题期间,尽管看到“您的protobuf版本较旧”和“您的protobuf版本较新”,但最新版本的protoc仍然有效。