Ubuntu16.04編譯tensorflow的C++接口

之前有一篇介紹到在windows下利用VS2015編譯tensorflow的C++接口,接下來這篇就介紹下在Ubuntu下編譯tensorflow的C++接口。
先說一下我的電腦配置,首先是Ubuntu16.04,anaconda用的是3.4.2,CUDA用的是9.0的,cudnn用的是7.0.5的。因為已經(jīng)在anaconda3上安裝好了tensorflow1.7的,但是這次要編譯C++的接口,所以我還是選擇編譯tensorflow1.7的源碼。最近重新編譯的時候改用了tensorflow1.12。

一、準備編譯環(huán)境

編譯這里要用到bazel來編譯,所以要安裝它,Ubuntu下安裝的指令如下:

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list

然后輸入以下指令:

curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -

更新:

sudo apt-get update

安裝bazel:

sudo apt-get install bazel

這里不要這么做了,因為這么做會把bazel更新到最新的版本,但是編譯tensorflow的時候,不同tensorflow要與bazel的版本是對應的,如果這么做的話,后面的操作就會出錯,而且也不知道怎么解決。正確的做法應該是下載對應的版本來安裝bazel,tensorflow與bazel的版本應該在tensorflow的官網(wǎng)查找:https://tensorflow.google.cn/install/source

linux下tensorflow與python、GCC、Bazel的版本關(guān)系,GCC倒是沒有問題,應該支持C++11就可以,但bazel就真的還是要對應好版本,不然一大堆問題,折騰。

| Version | Python version | Compiler | Build tools |
| tensorflow-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 |
| tensorflow-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 |
| tensorflow-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
| tensorflow-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
| tensorflow-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
| tensorflow-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
| tensorflow-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
| tensorflow-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
| tensorflow-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
| tensorflow-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
| tensorflow-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
| tensorflow-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |

| Version | Python version | Compiler | Build tools | cuDNN | CUDA |
| tensorflow_gpu-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
| tensorflow_gpu-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
| tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
| tensorflow_gpu-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
| tensorflow_gpu-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
| tensorflow_gpu-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
| tensorflow_gpu-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
| tensorflow_gpu-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
| tensorflow_gpu-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
| tensorflow_gpu-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
| tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
| tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |

其他的應該就沒啥,就是這個bazel把我給折騰的啊

這里tensorflow1.12對應的bazel版本是0.15.0,所以去github搜bazel下載http://bazel-0.15.0-installer-linux-x86_64.sh,然后安裝。

二、下載tensorflow源碼

tensorflow的源碼是在github上就可以下載的,目前已經(jīng)更新到1.11,但是我還是下載了1.7的版本,我下載的是版本1.12的。下載之后解壓出來。

三、配置編譯環(huán)境

解壓源碼之后,進入根目錄,輸入指令:

./configure

接下來就是配置清單:


image.png

image.png

這里要說明的是如果有CUDA,那么Do you wish to build Tensorflow with CUDA?一定要選Y,然后其它的我基本都是N
配置好之后就進行編譯:

bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

這里如果不用cuda的話(前面配置的時候就不要在CUDA那一項那里輸入Y),就輸入:

bazel build --config=opt  //tensorflow:libtensorflow_cc.so

然后是等待,這個過程大概會花費30分鐘左右,而且CPU的占用量是達到100%的,所以這個時候最好就不要坐別的事情了。
編譯之后我這里會有一個問題(這個問題我在編譯tensorflow1.12的時候沒有遇到,所以看不同版本吧):

image.png

這個錯誤并不是因為文件沒有而是因為找不到,實際上,這個文件就在tensorflow-r1.7/tensorflow文件夾下,但是需要修改/tensorflow-r1.7/tensorflow/BUILD這個文件才行,打開這個文件之后修改大概在812行,注釋掉后,另起一行設(shè)置正確的路徑:


image.png

修改之后重新輸入編譯的指令編譯一次就可以了。編譯好之后在文件夾tensorflow-r1.7/bazel-bin/tensorflow下面,會有兩個so文件:libtensorflow_cc.so和libtensorflow_framework.so,這兩個就是我們需要的。

四、一些錯誤

下面這幾個錯誤都是在使用的時候發(fā)現(xiàn)的,主要是在編譯的時候有些依賴文件沒有下載到,所以需要自己去下載。
(1)、nsync_cv.h文件缺失:
這個文件一般是會在tensorflow/contrib/makefile/downloads/nsync/public這個文件夾下的,但是我這邊是編譯tensorflow的時候有些依賴文件沒有下載到導致它缺失,解決方法是存在/tensorflow/contrib/makefile/download_dependencies.sh這個文件,執(zhí)行它來下載相關(guān)的文件,相關(guān)文件會放在/tensorflow根目錄/tensorflow/contrib/makefile/downloads這個文件夾下;
(2)、提示Eigen相關(guān)的問題
這個問題跟前面的類似,如果下載了相關(guān)的依賴文件之后,在/tensorflow-r1.7/tensorflow/contrib/makefile/downloads文件夾下找到eigen文件夾,進入之后執(zhí)行以下指令進行eigen的編譯:

mkdir build
cd build
cmake ..
make
sudo make install

(3)、提示關(guān)于protobuf版本的問題
問題如下:

image

這個主要是protobuf版本的問題,所以要查看bazel-genfiles/tensorflow/core/framework/types.pb.h這個文件夾中關(guān)于protobuf的版本要求,然后下載相應的版本來更新即可,這里tensorflow1.12要求是protobuf要大于等于3.6
image

所以就去github上下載對應的protobuf版本。要下載源碼,然后編譯安裝即可。
暫時我就遇到這幾個問題,之后如果還有遇到其它問題,我會繼續(xù)更新的。

五、參考

1、https://blog.csdn.net/zwx1995zwx/article/details/79064064


陽光
在天上一閃
又被烏云埋掩
暴雨沖洗著
我靈魂的底片

-- 顧城

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容