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

概述

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

好了问题解决了(-_-),终于可以运行程序了
这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值