2017-09-15 2163 views
0

我已经通过virtualenv安装了TensorFlow。它运作良好。TensorFlow protobuf版本不匹配

现在我想使用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 

而且在外壳:

$ protoc --version 
libprotoc 3.4.0 

我曾经在我的环境protobuf-2.6.1但现在升级到3.4.0

的ubuntu 16.04

回答

1

的问题是,所述TensorFlow编译过程使用拉动其自身的协议缓冲区的分布。从TensorFlow v1.3.0开始,这个版本是协议缓冲区3.3.0。如果您想将您自己的C++代码与TensorFlow生成的头文件混合使用,则需要使用完全相同的版本(或者仅使用脚本来使用Bazel下载的发行版)。

另一种选择是从原始消息描述文件中生成属于自己的标头protoc

+0

我已经完成'apt-get remove protobuf-dev protobuf-compiler',然后我像前面提到的那样从源代码安装protobuf。但实际上,当我的安装位于'/ usr/local/lib'时,'/ usr/lib'下仍然存在'libprotobuf.so'。顺便说一句,有一个'libprotobuf9v5'在我的Ubuntu的,我想这就是原因。但卸载它将同时删除gnome桌面和其他有点有线的软件包。 –

+0

@JasonRen是的,'libprotobuf9v5'是Ubuntu中的C++协议缓冲区运行时库。看起来Gnome本身就是使用协议缓冲区,所以删除它不是一个好主意。你需要编译更新的版本,并配置编译器和链接器来选择正确的头文件和库(正如我所说的,更喜欢静态链接,否则你的程序将尝试加载安装在系统中的旧版本并失败)。 – jdehesa

+0

但面对protobuf没有用我自己的代码。 TensorFlow使用它。我怎样才能静态链接一个没有被我直接使用的库?@jdehesa –