1. 程式人生 > >ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...的問題

ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...的問題

----------------------------------------------------------------------------------------------

為什麼會出現undefined reference to 'xxxxx'錯誤?

首先這是連結錯誤,不是編譯錯誤,也就是說如果只有這個錯誤,說明你的程式原始碼本身沒有問題,是你用編譯器編譯時引數用得不對,你沒有指定連結程式要用到得庫,比如你的程式裡用到了一些數學函式,那麼你就要在編譯引數裡指定程式要連結數學庫,方法是在編譯命令列里加入-l m。-l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫文

件名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。

上面是後面補充的原因,但具體怎麼修改so博主還不是很清楚,所以你如果不清楚的話,可以按照下面的說法來,也可以自己查一查so檔案的相關資料。

---------------------------------------------------------以上為20180314更新-------------

注意:有時候舊版本的protobuffer生成的檔案在新版本中使用會產生各種不易排查的錯資訊,所以推薦在需要執行caffe的環境中都使用同一版本的。所以出現標題問題的時候,強硬的方法就是解除安裝原先的舊版本,重新編譯安裝protoc。

sudo apt-get remove libprotobuf-dev

sudo apt-get remove libprotobuf-compile

編譯以及安裝protoc

出現標題的問題,cd選擇進入protoc的資料夾目錄下,make clean,重新編譯安裝protoc。然後在caffe-master目錄下,make clean,重新make all -j4。

實際上,有些教程是讓人用apt安裝sudo apt-get install libprotobuf-dev。我開始以為很方便,但實際上到最後回遇到一個問題,就是當你所有依賴庫還有環境配好後,總是會遇到(我總共裝過三次,前兩次沒有問題,第三次出現了問題,被逼的按照這裡的來了,如果可以apt安裝的話,儘量用那個,會簡單很多)

.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...  

這類的錯誤。所以,還是用原始碼包來編譯安裝才能把這個問題解決掉,因為只要在編譯的時候出現這個問題,只要重新編譯一次protobuf就ok了。
在安裝之前需要先把工具automake給裝了:

sudo apt-get install autoconf automake libtool

那接下來就下載protobuf吧,在github下載,解壓https://github.com/google/protobuf
解壓後,進入目錄protobuf-master, 執行:

./autogen.sh

這是會提醒你的curl沒有安裝的錯誤。所以安裝curl吧,然後在https://github.com/paulsapps/gmock-1.7.0下載gmock(如果你的電腦不能翻牆就從我給的連結下載)。下完後不用解壓,直接把gmock-1.7.0-master.zip放到protobuf-master的目錄下就ok了。。然後再次執行./autogen.sh
執行成功後,依次輸入命令(還是在protobuf-master的目錄下):

./congigure --prefix = /home/yourname/local_install/
make
make check

之所以選擇本地根目錄下面安裝,而不在預設的/usr或者/usr/local/是因為便於遷移,這樣之後的make和make install產生的東西都會在根目錄下自建資料夾裡面,無需重新編譯和安裝

makemake check都會費一點時間如果你遇到很多次坑,每次都想重新編譯protobuf的話記得make之前要make clean一下)。如果make check之後出現類似:

這裡寫圖片描述

就可以開始

sudo make install

安裝之後還需要做如下操作

1、建立檔案 /etc/ld.so.conf.d/libprotobuf.conf 包含內容:

   /home/yourname/local_install/lib   

2、sudo ldconfig 這時,再執行protoc --version 就可以正常看到版本號了

---------------------------------------------------------------------------------------------------------

由於上面設定的安裝目錄發生變化,所以我們要修改caffe的makefile.config檔案,在include_dir後面新增 ~/local_install/include,在library_dir後面新增~local_install/bin 

2018/3/14更新

參考連結:http://blog.csdn.net/fansetcool/article/details/51569374