首先需要安装MATLAB,我装的是MATLAB2014a,安装完成后,可以在~/.bashrc中添加环境变量,这样在终端直接输入matlab就能打开了
export PATH=/usr/local/MATLAB/R2014a/bin:$PATH
配置MATLAB前,我已经配置好了caffe GPU的版本,编译matcaffe之前需要修改Makefile.config,我MATLAB的路径是/usr/local/MATLAB/R2014a
所以Makefile.config修改如下,记得去掉#号
MATLAB_DIR := /usr/local/MATLAB/R2014a
然后就可以编译了,进到caffe的根目录,我是~/caffe
make clean
make caffe -j4
make matcaffe
编译的时候,我有出现警告说我的gcc版本太高了,不过应该是编译成功了,但是没有去管它,有可能是这个原因导致我下面遇到了很多问题?我的gcc版本是5.4.1,没有去降它的版本,因为前面caffe和cuda的编译都涉及到这个版本问题,变来变去挺麻烦的。
然后编译下mattest
,测试下编译好的matcaffe是否能用
make mattest
这时会报错,MATLAB/R2014a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version GLIBCXX_3.4.20
not found 这种样子的错误,这是matlab所引用的库和caffe不同引起的(应该是gcc版本不同造成的),在matlab命令窗口输入system('exho $LD_LIBRARY_PATH'),发现里面的路径包含/usr/local/MATLAB/R2014a/sys/os/glnxa64、/usr/local/MATLAB/R2014a/bin/glnxa64,这两个路径里都有
libstdc++.so.6,但是它不包含GLIBCXX_3.4.20,所以让MATLAB找到系统的libstdc++.so.6就行了,所以看到一种方法是
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/libstdc++.so.6
我采用另一种修改链接的方法
分别在终端下输入
ldd ~/caffe/matlab/+caffe/private/caffe_.mexa64
在MATLAB命令窗输入
!ldd ~/caffe/matlab/+caffe/private/caffe_.mexa64
MATLAB会显示/libstdc++.so.6的默认路径为libstdc++.so.6 => /usr/local/MATLAB/R2014a/bin/glnxa64/libstdc++.so.6 (0x00007f9a9cb2b000),而在终端中显示了它的真实路径:/usr/lib/x86_64-Linux-gnu/libstdc++.so.6
解决方法如下
sudo mv /usr/local/Matlab/R2014a/sys/os/glnxa64/libstdc++.so.6 /usr/local/Matlab/R2014a/sys/os/glnxa64/libstdc++.so.6_back
sudo mv /usr/local/MATLAB/R2014a/sys/os/glnxa64/ libstdc++.so.6 /usr/local/MATLAB/R2014a/sys/os/glnxa64/ libstdc++.so.6_back
sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/local/MATLAB/R2014a/bin/glnxa64/libstdc++.so.6
解决这个问题后,又有新的问题出现,提示_ZN2cv8imencodeERKNSt 很长一串的东西,经过一番google,找到点眉目,我再次对比了终端下和MATLAB下所引用的库,感觉应该是opencv那几个库的问题(并不能保证所有人都是这几个库出问题),我像上面一样,改了下面3个库的软链接
libopencv_core.so.2.4 => /usr/local/MATLAB/R2014a/bin/glnxa64/libopencv_core.so.2.4 (0x00007effcd29e000)
libopencv_highgui.so.2.4 => /usr/local/MATLAB/R2014a/bin/glnxa64/libopencv_highgui.so.2.4 (0x00007effcd054000)
libopencv_imgproc.so.2.4 => /usr/local/MATLAB/R2014a/bin/glnxa64/libopencv_imgproc.so.2.4 (0x00007effccbc9000)
这下make matcaffe终于成功了,然后我就去MATLAB继续测试
打开MATLAB之后,
cd ~/caffe/matlab/demo/
im = imread('../../examples/images/cat.jpg');
[scores, maxlabel] = classification_demo(im, 1);
然后出现了下面的问题
然后一番google,找到了这样一段话
A few possible issues related to Caffe:
You may need to add the path to CUDA libraries (usually in /usr/local/cuda/lib64) to LD_LIBRARY_PATH before starting MATLAB.(这个在配置CUDA的时候已经设置了)
When running the code, if you get an error saying: /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol: FT_Face_GetCharVariantIndex, try adding /usr/lib/x86_64-linux-gnu/libfreetype.so.6(or the equivalent library that your system may have) to the LD_PRELOAD environment variable before starting MATLAB.
所以我在~/.bashrc 下加了一句
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libfreetype.so.6
最后终于MATLAB也能运行出结果了,但是有一个小问题,我的电脑上给MATLAB在桌面建了个图标,通过桌面图标运行的MATLAB,测试caffe还是会出上面的错误,但是通过终端输入matlab运行的MATLAB可以正常运行,出现这个的原因是在终端运行的matlab,会通过.bashrc加载环境变量,因为是通过终端运行的;但是通过桌面图标运行的matlab并不会调用.bashrc(我认为应该是这样),自然不会运行export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libfreetype.so.6这个命令,所以还是会出错。