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)