3

阿木币

0

精华

183 小时

在线时间

技术大V

Rank: 4

发表于 2020-5-31 19:22:54 8583 浏览 2 回复

[入门教程] Linux下cmake编译流程实践--初学篇

本帖最后由 chasing 于 2020-5-31 19:28 编辑

Linux 下文件颜色说明

1. 红色表示压缩包文件
2. 绿色代表可执行文件
3. 蓝色表示文件夹
4. 白色表示一般性文件

Linux 下hello SLAM 工程编译

参考视觉SLAM工程,设计最简单的文件如下:
  1. #include<iostream>
  2. using namespace std;

  3. int main(int argc, char** argv)
  4. {
  5.     cout<<"Hello, SLAM!"<<endl;
  6.     return 0;
  7. }
复制代码

`g++ hello.cpp` 则默认编译生成`a.out`,若要指定文件名,则采用`g++ -o hello.out hello.cpp`
在实际操作过程中,则采用cmake来管理代码,此方法管理多文件时比较方便。首先创建`build`文件夹就用来存储生成的中间文件,然后创建并编辑`CMakeLists.txt`文件如下:
  1. #声明Cmake的最低版本信息
  2. cmake_minimum_required( VERSION 2.8)
  3. #声明一个cmake工程
  4. project( HelloSLAM)
  5. #添加执行文件
  6. add_executable(HelloSLAM hello.cpp)
复制代码

编译过程中,先进入build文件夹,然后

  1. cd build
  2. cmake ..
  3. make
复制代码
工程中使用库

首先编写库文件,这里创建libHelloSlam.cpp,以及libHelloSlam.h,其中CPP文件如下:
  1. #include<iostream>
  2. using namespace std;
  3. void printHello()
  4. {
  5.     cout<<"hello SLAM"<<endl;
  6. }
复制代码

添加 `CMakeLists.txt`文件内容
  1. cmake_minimum_required( VERSION 2.8)

  2. project( HelloSLAM)

  3. add_executable(HelloSLAM hello.cpp)
  4. add_library(libHello SHARED libHelloSlam.cpp)
复制代码
然后,按照上述同样的方法进行cmake以及make指令,会生成`liblibHello.so`文件(共享库,相对于静态库更省空间)。然后编写库文件的头文件,方便其他地方调用,其头文件如下:
  1. #ifndef LIBHELLOSLAM_H_
  2. #define LIBHELLOSLAM_H_
  3. void printHello();
  4. #endif
复制代码

创建主函数,以及修改调用

  1. #include "libHelloSlam.h"
  2. int main( int argc, char** argv)
  3. {
  4.     printHello();
  5.     return 0;
  6. }
复制代码
添加`CMakeLists.txt`如下
  1. cmake_minimum_required( VERSION 2.8)
  2. project( HelloSLAM)
  3. add_executable(HelloSLAM hello.cpp)
  4. add_executable(useHello useHello.cpp)
  5. target_link_libraries(useHello libHello)
  6. add_library(libHello SHARED libHelloSlam.cpp)
复制代码

至此,完成最后的cmake,以及make指令就可以实现调用库函数输出了。

在实际使用C++工程中,常采用这种方法实现整个工程的编译。

一个不是很恰当的例子:Eigen库的使用

之所以选用eigen库,是因为eigen库在APM,PX4以及SLAM中都会用到,是一个常见的高效的矩阵运算库。在Ubuntu的安装方法为:
  1. sudo apt-get install libeigen3-dev
复制代码
默认情况下,该库会安装在`/usr/include/eigen3`下。之所以说是一个不是很恰当的例子,是由于该库只有头文件,没有对应的cpp文件。其对应的`CMakeLists.txt`文件为
  1. cmake_minimum_required( VERSION 2.8)
  2. project( HelloSLAM)
  3. add_executable(HelloSLAM hello.cpp)
  4. add_executable(useHello useHello.cpp)
  5. target_link_libraries(useHello libHello)
  6. add_library(libHello SHARED libHelloSlam.cpp)

  7. include_directories("/usr/include/eigen3")
  8. add_executable(eigen_learn eigen_learn.cpp)
复制代码

给出参考的`eigen_learn.cpp`文件如下:

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. #include <eigen3/Eigen/Core>
  5. #include <eigen3/Eigen/Geometry>
  6. using namespace Eigen;
  7. int main(int argc, char** argv)
  8. {
  9.     Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();
  10.     cout<<rotation_matrix<<endl; //output the 3*3 identity matrix

  11.     rotation_matrix<<1,2,3,4,5,6,7,8,9;  //init the value

  12.     Eigen::AngleAxisd rotation_vection (double(0.25*M_PI), Eigen::Vector3d::UnitZ());
  13.     //rotation 45 degree along z axis
  14.     cout<<"rotation_vection=\n"<<rotation_vection.matrix()<<endl;

  15.     cout<<"rotation_matrix(0,0)="<<rotation_matrix(0,0)<<endl;
  16.     cout<<"rotation_matrix(2,2)="<<rotation_matrix(2,2)<<endl;


  17.     rotation_matrix = rotation_vection.toRotationMatrix();
  18.     cout<<rotation_matrix<<endl;

  19.     Eigen::Vector3d v(1,0,0);
  20.     Eigen::Vector3d v_rotation = rotation_matrix*v;
  21.     cout<<v_rotation.transpose()<<endl;
  22.     cout<<v_rotation<<endl;

  23.     //quat
  24.     Eigen::Quaterniond q;
  25.     q = Eigen::Quaterniond(rotation_vection);
  26.     cout<<q.coeffs()<<endl;
  27.     q = Eigen::Quaterniond(rotation_matrix);
  28.     cout<<q.coeffs()<<endl;

  29.     return 0;
  30. }
复制代码

注:先包含头文件,才能使用`using namespace Eigen;`使用命名空间后,`Eigen::`可以省去。上述程序的输出结果为:


                               
登录/注册后可看大图


文章原博客网址:https://blog.csdn.net/qq_15390133/article/details/106457036


扫一扫浏览分享
回复

使用道具 举报

139

阿木币

0

精华

306 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2020-6-1 17:52:51
我不为己,谁人为我,但我只为己,那我又是谁?
回复

使用道具 举报

207

阿木币

0

精华

376 小时

在线时间

版主

Rank: 7Rank: 7Rank: 7

发表于 2020-6-2 14:40:43
给楼主赞一个!!
回复 点赞

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表