概述
小白之前一直没有接触过Linux下面的c++编程和代码的调试,以前都是基于Windows开发的c++,用的也一直都是vs的编辑环境。现在由于实际的需求,需要在Linux下面建立c++工程去调用caffe的c++接口,从而调用基于caffe训练好的分类模型。由于没有接触过Linux下面的c++编程和调试,小白是费了老鼻子劲了,都被caffe依赖的头文件和库整无语了。下面小白详细介绍怎么脱离caffe直接新建c++工程去调用caffe的c++接口。
C++编译环境:
Eclipse的安装:
小白也是参考网上的博客资源来安装的eclipse:需要先安装OpenJDK Java,然后再安装eclipse,我是参考的下面的这篇博客:
http://www.jb51.net/article/55131.htm
eclipse配置opencv
由于后续我需要用到Linux下面的opencv库,所以下面介绍一下eclipse怎么配置opencv库进行图像处理。由于我之前安装过opencv,所以这里就不介绍怎么安装opencv了,如果没有安装opencv的可以去网上找一下Ubuntu下安装opencv的教程(很多的)。小白在eclipse下配置opencv是参考官网的文档的,其实是很简单的。下面贴出官网的网址:
http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_eclipse/linux_eclipse.html
注:主要是头文件和库加载对了就行,配置完了可以写一个小程序测试一下。
基于eclipse调用caffe的c++接口
这里先吐槽一下,小白在网上找了好久的资料,发现很少有相关的资料。有的博客也是坑比较多,讲解的比较粗糙。下面将从如何建立c++工程的步骤以及头文件和库的配置和遇到的问题进行介绍。
1. 新建工程
启动eclipse,新建一个c++ project的工程:File ->New ->C++ project,选择一个空的Linux GCC工程并起个名字,如下图所示:
在工程中先添加源文件,
File ->New ->Source File
其实caffe的底层代码就是c++写的,只不过是支持Python和matlab的接口调用。在caffe/examples/cpp_classification文件下面有一个classification_cpp就是c++写的,主要是用于调用训练好的模型测试分类。想要用c++调用caffe的c++接口可以参考这个cpp文件里面的格式。小白为了简单的测试把classification_cpp的代码直接复制到上面新建的cpp中了,
- 改了头文件的包括方式将<>改为“”。
- 改了主函数(修改后不需要从外面读入参数,直接写好需要加载的参数。)
2.Opencv的配置
按照前面opencv的配置操作步骤就可以,配置好opencv的头文件和库文件。
3.Caffe的配置(要注意了,这里很关键的)
主要是配置加载头文件和相对应的库。
include头文件的加载
在
Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Compiler -> Includes – >Include paths(-I)
里面添加:
home/xjz/caffe-master/include
这里吐槽一下:我也是参考了一篇博客来加载头文件的,他提示的就加载这一个头文件,结果后面编译的时候会提示许多错误,找不到相对应的头文件(这里你们别急)。
对于这个小白也是无奈了,我是提示少了什么头文件,我就在系统里面搜索相对应的头文件,找到其位置后,在Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Compiler -> Includes – >Include paths(-I) 里面添加其对应的路径。
小白贴出自己所要加载的头文件:
Caffe头文件的修改
在caffe-master/include/caffe/util/mkl_alternate.hpp文件里进行如下修改:
将#include< cblas.h >注释,添加#include< mkl_cblas.h >,保存即可。
1.库文件的加载
小白是在这里被卡了老久,依赖的库文件太多了,网上找的资料提示要加载的库文件很少,结果编译的吓死小白了,老是提示各种各样的错误,都是缺少了依赖的库。
- 添加依赖库的路径主要是在:
Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Linker -> Libraries – >Include paths(-I) 里面添加:
/home/xjz/caffe-master/build/lib
-
添加依赖库的名字主要是在:
Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Linker -> Libraries – >Libraries(-l) 里面添加:
caffe
如下图所示
在Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Linker -> Miscellaneous – >Other objects 里面添加:
/home/xjz/caffe-master/.build_release/lib/libcaffe.so
到这里你可以尝试着用eclipse编译一下,看看会不会出现如下的错误:
/usr/include/boost/system/error_code.hpp:222:‘boost::system::generic_category()’未定义的引用
找了好久的资料发现原来是由于boost库没有安装,如何查看你的系统有没有安装boost的库,一般boost安装完了会在/usr/local/lib和/usr/local/include中有对应的boost的库和头文件,下面介绍怎么安装boost库。
2.Boost库的安装:
去官网下载boost_1_58_0.tar.bz2:
https://sourceforge.net/projects/boost/files/boost/1.58.0/
前期准备
boost中,用到了别的函数库,所以为了使用boost中相应的功能,需要先安装系统中可能缺失的库:
apt-get install mpi-default-dev #安装mpi库
apt-get install libicu-dev #支持正则表达式的UNICODE字符集
apt-get install python-dev #需要python的话
apt-get install libbz2-dev #如果编译出现错误:bzlib.h: No such file or directory
安装
安装完依赖的库后就开始解压下载的boost_1_58_0.tar.bz2,解压后将当前工作目录切换到解压的文件夹下进行安装。
执行: sudo ./bootstrap.sh
生成文件b2和bjam,计算md5sum发现二者完全一致。
编译boost(编译的时间会有点久)
执行:sudo ./b2
将生成的库安装到/usr/local/lib目录下面,默认的头文件在/usr/local/include/boost目录下边;
执行:sudo ./b2 install
3.Eclipse下配置boost
到这里就完成了boost库的安装,到这里小白以为应该是没有什么问题了,用eclipse重新编译了一下发现刚才的问题还有:
/usr/include/boost/system/error_code.hpp:222:对‘boost::system::generic_category()’未定义的引用
原来是链接(Link)的时候出问题了. asio调用了boost_system库, 这货的确在/usr/local/lib里面, 但是在链接的时候,它找不到的.需要手动指定。我们需要在eclipse中配置boost的库文件。
在properties->C/C++ Build->Settings, 点击选择 GCC C++ Linker-> Libraries,如下图, 然后在右边的Libraries(-l)中添加库文件boost_system,另外同时需要加载boost库文件的路径,在Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Linker -> Libraries – >Include paths(-I)里面添加:
/usr/local/lib。
由于小白的opencv的库文件也是在这个路径下,上面配置opencv的时候已经包含了此路径了,所以小白这里就没有在添加了。
重新编译一下,错误:
/usr/include/boost/system/error_code.hpp:222:对‘boost::system::generic_category()’未定义的引用
应该是没有啦。
缺少的库文件的添加
但是不要高兴太早,后面好像还是有其他的问题的,可能会出现如下这种类似的错误:
/usr/local/lib/libglog.so.0: error adding symbols: DSO missing from command line
这应该是缺少了依赖库文件,上面的错误就是少了libglog.so库文件,遇到这种问题是去找到这个库文件的路径,然后在Project -> Properties ->C/C++ Build -> Settings ->GCC C++ Linker -> Miscellaneous – >Other objects里面添加库的路径:
/usr/local/lib/libglog.so
好了到了这里,在用eclipse编译一下应该是没有什么问题了。哈哈终于问题都解决了。
共享库路径的添加
运行程序,发现问题又来了(整个人不好了),出现如下的错误:
error while loading shared libraries :libcaffe.so.10.0-rc3:cannot open share
网上找了一下发现一般出现这中问题的原因一般有两个:
- 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可。
-
另外一个原因就是已经安装了该共享库,但执行需要调用该共享库的程序的时候,
程序按照默认共享库路径找不到该共享库文件,所以安装共享库后要注意共享库路径设置问题。
我们这里应该是属于第二情况,修改如下:
/etc/ld.so.conf文件中加一行/home/xjz/caffe-master/build_release/lib,用gedit打开ld.so.conf进行添加就行。添加保存后执行:
sudo ldconfig
好了问题解决了(-_-),终于可以运行程序了