ROS2中的CMakeLists(一)——基础知识

news2024/11/23 8:37:19

在使用ROS2框架开发机器人应用时,对各个功能包Cmakelist.txt文件的更改尤为重要。本系列旨在总头开始介绍Cmakelist.txt各条语句的意义和内涵。

Cmake已经是高度集成的构建工具,其作用是在不同开发环境下生成makefile文件,以此来执行make指令,将一系列c++源码编译为可以运行的文件。所以,我们将先介绍c++的编译过程

一、C++的编译过程

由c++源文件(即以.hpp和.cpp结尾的源文件)到可执行文件(在linux系统中默认以.out结尾)分为以下4个过程。

1、预处理:将#define定义的内容添加到代码中,处理#ifndef #endif等标记,完成删除注释等操作

2、编译:把C++代码编译为汇编语言代码

3、汇编:把汇编语言代码编译为二进制机器码

4、链接:将编译完成的二进制代码与诸如标准库等系统组件结合,使之能够运行

 当我们执行如下指令时,编译器已经自动将这四个步骤执行完毕。

g++ mysource.cpp -o myexe.out

mysource.cpp为源文件,myexe.out为编译出的可执行文件。

二、动态链接库和静态链接库

链接这一步会把我们编写的二进制代码与其他组件结合,其他组件包括标准库,也包括他人完成的库文件。譬如,如果在如下的代码中使用matio库

#include <string>
#include "matio.h"

int main(void)
{
    std::string path="/home/test.mat";
    std::string name="value"; 
    //待读取文件的地址和变量名称

    mat_t* p_mat_info;
    p_mat_info=Mat_Open(path.c_str(),MAT_ACC_RDONLY);
    matvar_t* p_mat_var;
    p_mat_var=Mat_VarRead(p_mat_info,name.c_str());
    double* data=(double*)p_mat_var->data;
}

mat_t和matvar_t均为matio库定义的类型,我们自己编写的代码中并不不包含其具体定义和实现。但我们的编写的代码保留了这一份标记,在经历预处理、编译和汇编步骤后,经得到的二进制代码与系统中保存的matio库二进制代码结合,使最终的可执行文件可以利用matio库包含的功能。这便是编译,而其中库的二进制代码,一般被称为库文件

依据链接的形式不同,库文件可以被分为静态链接库动态链接库

1、静态链接库:将所需的二进制代码片段拷贝到源代码编译得到的二进制文件中。

2、动态链接库:将所需的二进制代码的地址拷贝到源代码编译得到的二进制文件中。

两者的关系类似于普通函数和内联函数,按地址传递参数与按值传递参数。可以看出计算机中的概念时密切联系的!

在linux系统中,动态链接库以.so结尾,静态链接库以.a结尾。

在windows系统中,动态链接库以.dll结尾,静态链接库以.lib结尾。

进入linux系统的/lib目录,可以发现非常多的库文件,这些库文件都是系统中各个软件运行所需的必要保障。

lib目录下的.so文件和.a文件

三、make和Makefile的使用

对于简单的项目,比如单个c++文件,使用gcc/g++指令就可以实现由项目源文件到可执行文件的转变。但对于有多个cpp文件,多个hpp文件,使用了多个外部链接库的大项目,使用gcc/g++指令进行编译操作会复杂!

这里有笔者对于使用matio库的介绍:

Ubuntu平台上C语言利用matio库读取mat文件-CSDN博客

gcc test.c /usr/lib/libmatio.a -o name

可以看到,链接操作需要提供外部链接库的地址。如果一个项目使用了数十个,数百个链接库,每次编译就要输入非常长的指令。所以,make工具和makefile文件诞生了。makefile文件记录如何复杂项目的编译方式,make命令将其实现

使用如下命令在ubuntu系统中安装make工具

sudo apt install ubuntu-make

如下博文介绍了make工具的使用方式,本文不再详细介绍:

windows环境安装make命令-CSDN博客

四、cmake和CMakeLists的使用

make工具和makefile文件有一定局限性:其语法相对复杂,平台通用性较差。所以,cmake工具应运而生!

cmake允许开发者编写一种与平台无关(跨平台)的CMakeLists.txt 文件来制定整个工程的编译流程,cmake 工具会解析CMakeLists.txt 文件的语法规则,再根据当前的编译平台,生成本地化的Makefile 和工程文件。

可以使用如下指令在ubuntu上安装cmake:

sudo apt-get install cmake

下面给出最简单的cmake使用示例:

1、创建一个目录,在其中创建一个c++文件,编写一段非常简单的c++代码

#include <iostream>

int main(void)
{
    std::cout<<"Cmake is fun!";
    return 0;
}

2、在相同目录下创建CMakeLists.txt文件并进行编辑

注意,文件需要别严格命名为CMakeLists.txt

project(MYproject)
add_executable(myexecutable mycode.cpp)

project语句规定了项目名称,MYproject即为项目名,可以随意替换。

add_executable语句生成了一个可执行文件,名称为myexecutable,并且是由源文件mycode.cpp生成的。这句话其实等价于在命令行直接输入

g++ mycode.cpp -o myexecutable

也可以使用如下方式在CMakeLists.txt文件中创建变量,实现语句的简化

project(MYproject)
set(SOURCE_CODE mycode.cpp)
add_executable(myexecutable ${SOURCE_CODE})

3、运行cmake工具进行项目构建

在项目所在目录输入以下指令,可以运行cmake工具。cmake工具会自动寻找CMakeLists.txt文件并生成Makefile文件!

cmake .

 如图所示,cmake工具生成了一系列文件,包括最重要的Makefile和其他中间文件。

4、运行make工具生成可执行文件

在项目目录下输入以下指令,便可make工具自动寻找Makefile文件编译项目,得到所需要的可执行文件。

make


5、将编译结果与源文件分离

在某个文件夹里运行cmake指令,默认将生成的文件存在当前文件夹里。但如果cmake指令后面加上参数,可以将处理其他文件夹的源文件。

按照这个思路,我们在项目文件夹里创建src文件夹,build文件夹以及脚本,便可以实现分离!

其中,src文件里包含着源文件和CMakeList.txt,build文件夹为空,buildprocess.txt是我写的脚本,如下所示。

cd build
cmake ../src
make

即可在build文件里得到可执行文件!

五、ros2中的CMakeLists

ros2中,工作空间下包含4个文件夹:

其中,src文件夹储存源文件, build文件夹储存编译后的文件,install文件夹储存中间文件和资源文件。

src文件夹下有若干功能包,对于c++编写的功能包,目录下就包含了CMakeLists,如下所示:

当我们在工作空间下运行如下命令的时候

colcon build

ros2自带的构建工具会自动执行cmake指令和make指令,将源文件转化为可执行文件,并储存在build文件夹对应的位置中!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1862605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子

前言&#xff1a;System.Linq.Dynamic 是什么&#xff1f; System.Linq.Dynamic 扩展了 .NET 中的 LINQ 查询功能&#xff0c;通过它&#xff0c;我们可以在运行时动态构造 LINQ 查询表达式&#xff0c;就像是写原生 SQL 语句一样&#xff0c;更加灵活直观。 利用 System.Lin…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析&#xff0c;可以使用外置的逻辑分析仪&#xff0c;但成本较高&#xff0c;对初学者来说没有必要&#xff0c;可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析&#xff0c;不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…

YOLOv5改进(八)--引入Soft-NMS非极大值抑制

文章目录 1、前言2、各类NMS代码实现2.1、general.py 3、各类NMS实现3.1、Soft-NMS3.2、GIoU-NMS3.3、DIoU-NMS3.4、CIoU-NMS3.5、EIoU-NMS 4、目标检测系列文章 1、前言 目前yolov5使用的是NMS进行极大值抑制&#xff0c;本篇文章是要将各类NMS添加到yolov5中&#xff0c;同时…

2024最适合初学者人手一本的LLM大语言模型综述,爆火全网!(附PDF)

今天给大家推荐一本大模型&#xff08;LLM&#xff09;这块的一本外文书&#xff0c;经过整理已经出中文版了&#xff0c;就是这本《大型语言模型综述》&#xff01;本书在git上有9.2k star&#xff0c;还是很不错的一本大模型方面的书。 本教程内容主要内容&#xff1a;中文版…

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC&#xff0c;即客户之声&#xff0c;是一种通过收集和分析客户反馈、需求和期望&#xff0c;来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下&#xff0c;VOC不仅能够帮助企业了解客户的真实需求&#xff0c;还能为企业提供宝贵的竞争情报&#xff0c;助力企业…

STL——常用算法(二)

一、常用拷贝和替换算法 1.copy #include <iostream> #include <vector> #include <algorithm> using namespace std; void printVector(int val) {cout << val << " "; } void test01() {vector<int>v1;for (int i 0; i <…

监控https证书的到期时间

实现该功能&#xff0c;不用借助第三方库&#xff0c;用go的标准库就足够了… 以下程序可以获取这些域名的SSL证书的到期时间&#xff0c;并在证书距离现在不足7天过期时打印提示&#xff1a; package mainimport ("crypto/tls""fmt""net""…

酒店强心剂——VR智慧酒店上线,史诗级加强入住率

出门在外&#xff0c;什么才是我们最为头疼的问题呢&#xff1f;衣食住行中&#xff0c;住的问题尤其大&#xff0c;尤其是不熟悉当地情况下&#xff0c;预定酒店才是让人头疼的问题。酒店行业该如何化解这一难题呢&#xff1f;VR全景开启智能化酒店宣传获客新模式&#xff0c;…

Hive笔记-6

6.2.8 聚合函数 1) 语法 count(*)&#xff0c;表示统计所有行数&#xff0c;包含null值&#xff1b; count(某列)&#xff0c;表示该列一共有多少行&#xff0c;不包含null值&#xff1b; max()&#xff0c;求最大值&#xff0c;不包含null&#xff0c;除非所有值都是null&a…

高考填报志愿攻略,5个步骤选专业和院校

在高考完毕出成绩的时候&#xff0c;很多人会陷入迷茫中&#xff0c;好像努力了这么多年&#xff0c;却不知道怎么规划好未来。怎么填报志愿合适&#xff1f;在填报志愿方面有几个内容需要弄清楚&#xff0c;按部就班就能找到方向&#xff0c;一起来了解一下正确的步骤吧。 第…

Docker中修改TiDB数据库密码(类似mysql)

1.Docker容器运行TiDB pingcap/tidb:last 2.登陆容器系统&#xff1a; 3.在容器中安装mysql客户端&#xff1a; 4.空密码登陆TiDB 5.修改TiDB密码并退出 6.使用修改后的密码登陆验证&#xff1a;

福州代理记账服务财务专业知识会计助手

福州的代理记服务可探索企业和个体工商户处理财务和会计工作。选择合适的代理记服务不仅可以节省成本&#xff0c;还可以确保财务工作专业、合规。以下是一些关于代理记服务的关键信息和财务信息&#xff0c;供您参考&#xff1a; https://www.9733.cn/news/detail/180.html …

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow介绍 &#x1f349;主要特点和功能 &#x1f348;多语言支持 &#x1f348;灵活的架构 &#x1f348;分布式训练 &#x1f348;跨平台部署 &#x1f348;强大的工具链 &#x1f348;丰富的社区和生态系统 &a…

缓冲池管理器

开发环境搭建 克隆 git clone https://github.com/cmu-db/bustub.git cd bustub/ 切换分支 git checkout -b branchname v20221128-2022fall 创建docker镜像 docker build . -t bustub_img 创建容器 docker create -it --name bustub_container -v “E:/cmu/bustub”:“/bustu…

JeecgFlow事件网关概念及案例

事件网关 通常网关基于连线条件决定后续路径&#xff0c;但事件网关有所不同&#xff0c;其基于事件决定后续路径。事件网关的每条外出顺序流都需要连接一个捕获中间事件。 事件网关只有分支行为&#xff0c;流程的走向完全由中间事件决定。可以从多条候选分支中选择事件最先达…

Core ML 简介:构建简单的图像识别应用程序

在 2017 年的 WWDC 上&#xff0c;苹果发布了许多令人兴奋的框架和 API 供我们开发人员使用。在所有新框架中&#xff0c;最受欢迎的框架之一肯定是Core ML。Core ML 是一个可用于将机器学习模型集成到您的应用程序中的框架。Core ML 最好的部分是您不需要有关神经网络或机器学…

计算机组成原理 | CPU子系统(2)指令系统

CISC和RISC指令集 指令的一般格式 四种结构 R型&#xff1a;寄存器型&#xff08;四地址&#xff09; I型&#xff1a;立即数型&#xff08;三地址&#xff09; J型&#xff1a;跳转型&#xff08;address以立即数的形式给出&#xff09; 格式规整&#xff0c;高六位都是操作…

昇思25天学习打卡营第01天|基本介绍

作为曾经的javaer&#xff0c;本着不断学习的初心&#xff0c;报名了昇思25天的课程&#xff0c;希望自己能学会点东西的目的。 昇思MindSpore介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;…

解决chrome浏览器总是将对站点的http访问改为https的问题

问题&#xff1a;vue项目本地运行出来的地址是http开头的&#xff0c;但在chrome浏览器中无法访问&#xff0c;在Edge浏览器就可以&#xff0c;发现是chrome总是自动将http协议升级为https。 已试过的有效的方法&#xff1a; 一、无痕模式下访问 无痕模式下访问不会将http自…

《中国储运》杂志社中国储运杂志社中国储运编辑部2024年第6期目录

卷首语 提升物流质效 助力经济发展 楚耘; 12 专栏 大力发展新质生产力 依托新模式新业态推动物流成本有效降低 房永斌; 16 访谈 中国国际发展知识中心副主任、国务院发展研究中心研究员魏际刚&#xff1a;对促进物流行业降本增效的十个建议 李静宇; 17-19 特别策划…