Ubuntu下編譯caffe
注:這是一篇舊文,是在2015年12月,在一台i5 3210 AMD顯卡的筆記本上,第一次嘗試編譯安裝 Caffe,用的 Makefile方式。推薦用CMake方式構建。
純粹是個人編譯的記錄。不用CUDA(筆記本是amd卡);不手動編譯依賴包(apt-get是用來干啥的?用來直接裝二進制包,以及自動解決依賴項的)
caffe官方給出的ubuntu下的教程在http://caffe.berkeleyvision.org/install_apt.html
make: protoc: 命令未找到
解決辦法:
sudo apt-get install protobuf-c-compiler protobuf-compiler
fatal error: gflags/gflags.h:沒有那個文件或目錄
解決辦法:
sudo apt-get install libgflags-dev
順便吐槽一下ubuntu的apt-get命令的補全,它是殘破的。我想下載gflags,於是輸入:
sudo apt-get install gflags #此處直接按tab,希望它補全,tab一次不出來就再按一次
結果呢,只顯示了一個結果:
sudo apt-get install libgflags2v5
問題是,實際上有3個結果:libflags2v5
,libgflags-dev
,libgflags-doc
ubuntu的命令行,另一個殘破的地方在於,各種包總是喜歡私自添加lib前綴,比如,好好的opencv,非得要libopencv才行(全名並不是libopencv和opencv,通常都是用-dev或-devel各種的包)
fatal error: glog/logging.h: 沒有那個文件或目錄
嘗試apt-get install glog,媽蛋,沒有。要這樣:
sudo apt-get install libgoogle-glog-dev
fatal error: hdf5.h: 沒有那個文件或目錄
前面已經執行了apt-get install hdf5-tools
,怎么還說沒有hdf5?這次是ubuntu 16.04修改了hdf5頭文件目錄導致的,要在Makefile.config中把hdf5的一個目錄添加進來:
# 找到這行:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
# 替換為:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
fatal error: lmdb.h: 沒有那個文件或目錄
解決辦法:
sudo apt-get install liblmdb-dev
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1
這次的問題有點大了。問題完整描述:
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/ld: cannot find -lboost_python3
collect2: error: ld returned 1 exit status
Makefile:563: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1
解決辦法是改Makefile:
# 原來的
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
# 現在改成(64位系統):
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
# 或者,你是32位系統:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/i386-linux-gnu /usr/lib/i386-linux-gnu/hdf5/serial
可能仍然不行,需要借助sed腳本:
find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
這個可能是ubuntu自身的問題,也可能是caffe的問題。
blas的問題
作為小白用戶,方便起見,用不着去搞MKL,一則申請麻煩,二則太大。同時也要盡量避免手動編譯。手動編譯源碼可能帶來更多的依賴項問題。所以盡可能全都用apt-get安裝。
sudo apt-get install libopenblas-dev
reference
https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide
https://github.com/SHUCV/caffe_demo/wiki/install-caffe-on-ubuntu14.04
==== update 2016年11月5日 17:39:33 ====
換ubuntu16.04了,編譯caffe時會提示:memcpy
未定義
解決方法:Makefile中,找到:
NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
換成
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)