2017-09-15 324 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 –