roscpp添加第三方依赖库——以QuadProg++为例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangdianye/article/details/84983496

roscpp添加第三方依赖库——以QuadProg++为例

roscpp添加第三方依赖库——以QuadProg++为例

【小白教程,不喜勿喷】
昨天倒腾了一晚上,在roscpp的C++代码中添加求解二次规划的函数库。要不就是搜不到头文件要不就是链接不到库,小白伤不起。今天早上弄好了,下面总结一下从问题产生到解决的过程如下。本文的目标是寻找并调用求解二次规划问题现成函数。

搜索二次规划函数库并安装

登录github, 搜索“QuadProgpp”,可以找到有41个like的一个函数库(就决定是你了)。然后,点击进入该代码,获得地址:https://github.com/liuq/QuadProgpp.git
在terminal中找好一个文件目录,利用git命令将其克隆下来。

cd ~/Downloads
git clone https://github.com/liuq/QuadProgpp.git

然后参照这个网址(https://blog.csdn.net/sinat_27318881/article/details/82503100 )的步骤进行安装,拎出对应的incude头文件和lib库文件。贴出如下:

cd QuadProgpp
cmake -D CMAKE_INSTALL_PREFIX=/home/**yourname**/local/quad .
make
make install

注意安装的路径中,yourname要根据自己的需求改,又或者直接装在根目录下。make install之后就会在用户目录中的~/local/quad/中发现多了一些文件夹 如下所示:

$ cd ~/local/
$ tree
.
└── quad
    ├── cmake
    │   ├── quadprog-targets.cmake
    │   └── quadprog-targets-noconfig.cmake
    ├── include
    │   └── QuadProg++
    │       ├── Array.hh
    │       └── QuadProg++.hh
    └── lib
        └── libquadprog.a

5 directories, 5 files

没有tree命令的话可以先执行, sudo apt-get update; sudo apt-get install tree

CMakeLists.txt链接函数库

从这里开始,就开始涉及到如何调用这个函数库了。我们在文件的结构中可以看到,有一个libquadprog.a的文件,这个后缀名是什么意思呢?csdn一下找到这个网址(https://blog.csdn.net/sin0803/article/details/27556119 ):

1、.ko 是kernel object 的缩写,是Linux 2.6内核使用的动态连接文件,在Linux系统启动时加载内核模块。
2、.o 是相当于windows中的.obj文件
注意:.ko与.o的区别在于,.ko是linux 2.6内核编译之后生成的,多了一些module信息,如author,license之类的。.o文件则是linux 2.4内核编译生成的。
3、.a 是静态库,由多个.o组成在一起,用于静态连接
4、.so 是shared object的缩写,用于动态连接,和windows的dll差不多
5、.la 为libtool自动生成的一些共享库。

在roboware中创建工程和package,在package中对应的CMakeLists.txt中添加以下语句指导编译过程中的搜索:

include_directories(
  # /home/yourname/local/quad/include/
  ~/local/quad/include/
)

link_directories(
  # /home/youname/local/quad/lib/
  ~/local/quad/lib/
)
target_link_libraries(yourcppfile_withoutsuffix
  ${catkin_LIBRARIES}
  libquadprog.a  # library name
)

为什么要这么次改CMakeLists.txt 文件呢?CSDN一下找到这个网址:
https://blog.csdn.net/qq_31077649/article/details/72896294?locationNum=8&fps=1

添加头文件搜索路径: INCLUDE_DIRECTORIES(/usr/include/)
添加库文件搜索路径: LINK_DIRECTORIES(/usr/lib/) 
添加对库的链接: TARGET_LINK_LIBRARIES(target lib)

调用函数库

那么cpp文件要如何调用这些文件?下面来个示例代码:

#include "QuadProg++/Array.hh" 
#include "QuadProg++/QuadProg++.hh" 
#include <stdio.h> 
using namespace quadprogpp; 
using namespace std; 
int main() { 
  Matrix<double>G(2,2); 
  G[0][0] = 0.988; 
  G[1][1] = 1.8739; 
  G[0][1] = 0; 
  G[1][0] = 0; 
  Vector<double>g(2); 
  g[0] = -0.58; g[1] = -0.87; 
  Matrix<double>CE(2, 1); 
  CE[0][0] = 1; CE[1][0] = 1; 
  Vector<double>ce(1); 
  ce[0] = -1; 
  Matrix<double>CI(2, 2); 
  CI[0][0] = 1; CI[1][1] = 1; CI[0][1] = 0; CI[1][0] = 0; 
  Vector<double>ci(2); 
  ci[0] = 0; ci[1] = 0; 
  Vector<double>x(2); 
  clock_t startTime, endTime; 
  startTime = clock(); 
  for (int i = 0; i < 1000; i++) { 
    solve_quadprog(G, g, CE, ce, CI, ci, x); 
    cout << x[0] << " " << x[1] << endl; 
  } 
  endTime = clock(); 
  double total_time = (double)(endTime - startTime); 
  total_time = total_time *1000.0/ CLOCKS_PER_SEC; 
  cout << total_time << endl; 
  return 0; 
} 

#include “QuadProg++/Array.hh”
#include "QuadProg++/QuadProg++.hh"

注意这里的include使用了" "(而不是< >),设置了相对路径。调用头文件的方式如该网址所示,https://blog.csdn.net/weixin_39345003/article/details/80782231 。”QuadProg++/Array.hh“的实际搜索路径为
include_directories(
# /home/yourname/local/quad/include/
~/local/quad/include/
)
中添加的~/local/quad/include/的相对路径QuadProg++/Array.hh。从而搜索到了该头文件。

2018年12月13日
DianyeHuang

猜你喜欢

转载自blog.csdn.net/huangdianye/article/details/84983496