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

在使用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.mzph.cn/bicheng/35046.shtml

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

相关文章

【分布式文件系统HDFS】API 编程基础

目录 一、使用 HDFS API 完成以下程序设计并运行 1. 将 HDFS 文件系统目录/user/账户名下的文件 test1.txt 下载至本地文件系统目录/home/账户名/Desktop 下。 1.1 程序代码 1.2 运行截图 1.3 查看本地的test1.txt文件 2. 在 HDFS 文件系统上创建目录/test1 2.1 程序代码…

【PyQt5】一文向您详细介绍 setSpacing() 的作用

【PyQt5】一文向您详细介绍 setSpacing() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&am…

MT6989(天玑9300)芯片性能参数_MTK联发科5G处理器

MT6989是联发科Dimensity旗舰系列的成员&#xff0c;旨在为旗舰5G智能手机供应商提供最先进的技术和性能。MT6989也是联发科目前最具创新和强大的5G智能手机芯片&#xff0c;具有领先的功耗效率&#xff0c;无与伦比的计算架构&#xff0c;有史以来最快和最稳定的5G调制解调器&…

思科交换机基本配置命令

01进入特权模式enable switch>enable switch# 02进入全局配置模式configure terminal switch>enable switch#configure terminal switch(conf)# 03交换机命名hostname aptech2950以aptech2950为例 switch>enable switch#configure terminal switch(conf)#hostname apt…

反序列化底层学习

反序列化底层学习 前言 以前也是懒得学&#xff0c;觉得没有必要&#xff0c;学到现在发现好多东西都需要学习java的底层&#xff0c;而且很多漏洞都是通过反序列化底层挖出来的&#xff0c;比如weblogic的一些绕过&#xff0c;我这里也主要是为了学习weblogic来学习的&#…

Linux CentOS 环境 MySQL 主从复制集群搭建

环境说明 MySQL版本8.4.0 操作系统 Linux CentOS 7.9 官网文档 https://dev.mysql.com/doc/refman/8.4/en/replication-configuration.html 以下代码片段中带分号都是在MySQL命令行( mysql -uroot -p)中执行 1. 首先在两个节点上安装数据库 参考 Linux CentOS安装MySQL8.0 …

Nginx调度器

Nginx反向代理 反向代理架构 部署后端Web1服务器 部署后端Web2服务器 配置Nginx服务器&#xff0c;添加服务器池&#xff0c;实现反向代理功能 proxy主机安装nginx 修改/usr/local/nginx/conf/nginx.conf配置文件 重新加载配置 客户端使用火狐浏览器或curl多次访问p…

【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步

前言&#xff1a; 在前面我们已经学习了C中继承的相关知识&#xff0c;已经体会到C在与C语言的对比中的便捷性&#xff0c;但是有一些问题并没有被解决&#xff0c;比如继承中如何使不同的派生类公用基类的一个函数&#xff0c;这就需要多态的知识&#xff0c;而且&#xff0c;…

boost asio异步服务器(4)处理粘包问题tlv

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…

正版软件 | Copywhiz 6:革新您的文件复制、备份与管理体验

在数字化时代&#xff0c;文件管理的效率直接影响到我们的生产力。Copywhiz 6 最新版本&#xff0c;带来了前所未有的文件处理能力&#xff0c;让复制、备份和组织文件变得轻而易举。 智能选择&#xff0c;只复制更新内容 Copywhiz 6 的智能选择功能&#xff0c;让您只需几次点…

【PA交易】BackTrader: 讨论下分析器和评测指标

前言 BackTrader的分析器主要使用的是analyzers模块&#xff0c;我们可以从Analyzers - Backtrader找到一个非常简单的示例。这个示例中使用方式很简单&#xff0c;其他分析器也可以通过如此简单封装方式进行装载。如果仅是复制粘贴官方教程&#xff0c;完全是制造互联网垃圾…

Netty学习(一)——基础组件

根据黑马程序员netty视频教程学习所做笔记。 笔记demo&#xff1a;https://gitee.com/jobim/netty_learn_demo.git 参考博客&#xff1a;https://blog.csdn.net/cl939974883/article/details/122550345 一、概述 1.1 什么是Netty Netty is an asynchronous event-driven netw…

Redis-哨兵模式-主机宕机-推选新主机的过程

文章目录 1、为哨兵模式准备配置文件2、启动哨兵3、主机6379宕机3.4、查看sentinel控制台日志3.5、查看6380主从信息 4、复活63794.1、再次查看sentinel控制台日志 1、为哨兵模式准备配置文件 [rootlocalhost redis]# ll 总用量 244 drwxr-xr-x. 2 root root 150 12月 6 2…

label studio数据标注平台的自动化标注使用

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 做图文音项目过程中&#xff0c;我们通常会需要进行数据标注。label studio是一个比较好上手的标注平台&#xff0c;可以直接搜…

突出显示列,重点内容一目了然!

老师在发布查询时&#xff0c;希望学生家长一眼就能看到重要的信息&#xff0c;应该如何设置&#xff1f; 易查分的新功能&#xff1a;突出显示列&#xff0c;就可以轻松实现&#xff01;老师可以个性化设置突出显示列的样式&#xff0c;包括颜色、字体大小、隐藏标题等&#x…

P2实验室装修标准都有哪些

P2实验室&#xff08;也称为生物安全二级实验室&#xff0c;BSL-2实验室&#xff09;的装修标准需要满足一系列的设计和施工要求&#xff0c;以确保实验室的安全性和功能性。因此&#xff0c;P2实验室装修标准不仅要满足一般实验室的要求&#xff0c;还需符合生物安全的特殊规定…

餐厅点餐系统JAVA全栈开发(SSM框架+MYSQL)

代码仓库 GitHub - JJLi0427/Online_Order_SystemContribute to JJLi0427/Online_Order_System development by creating an account on GitHub.https://github.com/JJLi0427/Online_Order_System 项目介绍 餐厅点餐系统包含用户使用界面和功能实现&#xff0c;后台店员和管…

C++初学者指南-2.输入和输出---文件输入和输出

C初学者指南-2.输入和输出—文件输入和输出 文章目录 C初学者指南-2.输入和输出---文件输入和输出1.写文本文件2.读文本文件3.打开关闭文件4.文件打开的模式 1.写文本文件 使用&#xff1a; std::ofstream&#xff08;输出文件流&#xff09; #include <fstream> // 文…

YOLOv8关键点pose训练自己的数据集

这里写自定义目录标题 YOLOv8关键点pose训练自己的数据集一、项目代码下载二、制作自己的关键点pose数据集2.1 标注(非常重要)2.1.1 标注软件2.1.2 标注注意事项a.多类别检测框b.单类别检测框2.2 格式转换(非常重要)2.3 数据集划分三、YOLOv8-pose训练关键点数据集3.1 训练…

通过frp实现内外网映射

frp介绍和使用方法可以参考官网:安装 | frp 1、准备两台服务器&#xff0c;一台内网服务器A&#xff0c;一台有公网ip的外网服务器B(47.12.13.15) 2、去官方仓库下载frp安装包&#xff1a;Releases fatedier/frp GitHub 下载包根据自己服务系统选择 ​ 3、先在外网服务器…