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