Linux下基于eclipse的C++工程调用caffe的c++接口

  • Post author:
  • Post category:linux


概述

小白之前一直没有接触过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中了,

  1. 改了头文件的包括方式将<>改为“”。
  2. 改了主函数(修改后不需要从外面读入参数,直接写好需要加载的参数。)


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


网上找了一下发现一般出现这中问题的原因一般有两个:

  1. 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可。
  2. 另外一个原因就是已经安装了该共享库,但执行需要调用该共享库的程序的时候,

    程序按照默认共享库路径找不到该共享库文件,所以安装共享库后要注意共享库路径设置问题。

我们这里应该是属于第二情况,修改如下:

/etc/ld.so.conf文件中加一行/home/xjz/caffe-master/build_release/lib,用gedit打开ld.so.conf进行添加就行。添加保存后执行:

sudo ldconfig

好了问题解决了(-_-),终于可以运行程序了

这里写图片描述



版权声明:本文为xjz18298268521原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。