我通过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
答案 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_archive
,com_google_protobuf
和com_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仍然有效。