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.mfbz.cn/a/744132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8/v10项目使用教程

根据改好的YOLOv8.yaml改yolov10.yaml教程 打开ultralytics/cfg/models/v8路径&#xff0c;找到需要移植的yaml文件&#xff0c;从其中复制相关的模块。打开一个YOLOv10的yaml文件。 注释掉之前相应位置的模块&#xff0c;并粘贴上面复制的模块&#xff0c;完成。 其余使用步骤…

【Linux】使用ntp同步时间

ntp介绍 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是一种用于同步计算机时间的协议&#xff0c;工作在UDP的123端口上。它是一种客户端-服务器协议&#xff0c;用于同步计算机的时钟。通过连接到网络上的时间服务器&#xff0c;计算机可以获…

企业变革的引擎:PDM实施的策略与实践

在当今快速发展的信息技术时代&#xff0c;产品数据管理PDM系统已成为企业提升效率和竞争力的重要工具。PDM不仅是一项技术&#xff0c;更是一种管理思想的应用&#xff0c;它涉及到企业组织、管理和产品开发过程的全面变革。本文将探讨PDM实施的四大关键技术&#xff0c;为企业…

【安卓13 源码】RescueParty救援机制

RescueParty机制正是在这个背景下诞生的&#xff0c;当它注意到系统或系统核心组件陷入循环崩溃状态时&#xff0c;就会根据崩溃的程度执行不同的救援行动&#xff0c;以期望让设备恢复到正常使用的状态。 开机后会自动重启&#xff0c;进入Recovery界面。经查找&#xff0c;是…

YOLOv8+SwanHub+作物检测:从可视化训练到Demo演示

1. 项目介绍 本项目旨在利用先进的YOLOv8深度学习模型对麦穗进行高效、准确的检测。我们采用了GlobalWheat数据集&#xff0c;该数据集包含丰富的麦穗图像&#xff0c;为模型的训练提供了有力的数据支持。通过该实验&#xff0c;实现高准确率的麦穗识别&#xff0c;为农业生产提…

【深度学习】菜品目标检测软件系统

深度学习类文章回顾 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整体流程…

Matlab|【防骗帖】考虑时空相关性的风电功率预测误差建模与分析

目录 1 主要内容 2 部分程序 3 下载链接 1 主要内容 这个程序《考虑时空相关性的风电功率预测误差建模与分析》画的图片非常漂亮&#xff0c;和原文献基本一致&#xff0c;但是实际上内容并未实现出来&#xff0c;主要就是利用现有的风电预测的数据和结果做了相关的图&#…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

【咨询】企业数字档案馆建设规划建议书-模版范例

导读&#xff1a;本文提供范例可以作为xxx建设规划建议书模版 建议书结构 第一章 项目背景及意义 1.1.企业数字档案馆建设是构建新质生产力的重要抓手 1.2.企业数字档案馆建设是落实全国档案事业发展规划的重要支撑 1.3.企业数字档案馆建设是支撑提质增效、高质量发展的有效…

SF-YOLOv5——基于改进的特征融合模式的轻量级小目标检测算法

概述 提出了一种改进的YOLOv5模型&#xff0c;名为Small-Fast-YOLOv5 (SF-YOLOv5)&#xff0c;专门用于小目标检测。通过合理裁剪大目标检测层的特征图输出&#xff0c;显著减少了模型所需的计算资源&#xff0c;使模型变得更加轻量级。 还提出了一种改进的特征融合方法&#…

Python 全栈体系【四阶】(六十一)

第五章 深度学习 十三、自然语言处理&#xff08;NLP&#xff09; 5. NLP应用 5.2 文本情感分析 目标&#xff1a;利用训练数据集&#xff0c;对模型训练&#xff0c;从而实现对中文评论语句情感分析。情绪分为正面、负面两种 数据集&#xff1a;中文关于酒店的评论&#…

Orangepi Zero2 全志H616 的初识

目录 一、全志H616简介 1.1 为什么学&#xff1a; 1.2 学什么&#xff1a; 1.3 全志H616平台介绍&#xff1a; 二、刷机 系统启动和初始化配置 2.1 需要的工具&#xff1a; 2.2 工具安装&#xff1a; 2.3 刷机&#xff1a; 2.4 登录系统&#xff1a; 2.5 修改登录密码…

2024年世界移动大会(MWC Shanghai)——飞睿智能诚邀您,超宽带技术定位测距传输全家桶

超宽带UWB芯片SIP系列&#xff1a; FS100 FS200 超宽带UWB标签系列&#xff1a; FU3620-2 FUP410-1 超宽带UWB应用系列&#xff1a; FMFB200A&#xff08;门锁方案&#xff09; FU2625-2&#xff08;TAG方案&#xff09; FPDB200A&#xff08;音频&#xff09; FSTB200…

emqx4.4.3关于如何取消匿名登录,添加认证用户这件事

emqx4.4.3如何取消匿名登录&#xff0c;添加认证用户 emqx版本&#xff1a;4.4.3 背景&#xff1a;使用docker搭建完emqx后&#xff0c;使用 MQTTX 连接总是超时&#xff1a; 检查Java项目 是否有接口&#xff1a;https://XXXX:80/mqtt/auth? 若有&#xff0c;则具体逻辑查询…

MAB规范(3):Chapter6 Glossary 术语表

第6章 - 术语表 此章不做过多的批注&#xff0c;都是些简单的术语解释。

电机故障检测系统的通用性限制分析

电机故障检测系统因应用环境、功能需求、经济性等多方面差异而难以实现通用。工厂与实验室在环境条件、使用频率、功能需求、成本、维护及数据处理方面有显著不同&#xff0c;此外&#xff0c;LabVIEW软件在两者中的应用和数据处理也存在差异&#xff0c;这进一步限制了系统的通…

Android app Java层异常捕获方案

背景: 在Android app运行中,有时一些无关紧要的异常出现时希望App 不崩溃,能继续让用户操作,可以有效提升用户体验和增加业务价值。 新流程: 哪些场景需要Catch Crash Config配置信息: 支持从网络上获取Crash配置表,动态防护,避免crash。 使用: 在Application o…

汽车零部件制造企业如何选择合适的ESOP电子作业指导书系统

随着汽车产业的不断发展&#xff0c;汽车零部件制造企业在提高生产效率和产品质量方面面临着越来越大的挑战。为了解决这些问题&#xff0c;越来越多的汽车零部件制造企业开始采用ESOP电子作业指导书系统&#xff0c;以帮助他们管理和优化生产流程。但是&#xff0c;在选择合适…

Retrofit类型安全的HTTP客户端库(json)

简介 Retrofit是Square公司开发的一个类型安全的HTTP客户端库&#xff0c;用于Android和Java平台&#xff0c;它使得与Web服务的交互变得更加简单快捷。Retrofit将HTTP API转换成Java接口&#xff0c;让你可以用更简洁的代码形式调用RESTful API&#xff0c;Android网络编程重点…

机器学习之数学基础(七)~过拟合(over-fitting)和欠拟合(under-fitting)

目录 1. 过拟合与欠拟合 1.1 Preliminary concept 1.2 过拟合 over-fitting 1.3 欠拟合 under-fitting 1.4 案例解析&#xff1a;黑天鹅 1. 过拟合与欠拟合 1.1 Preliminary concept 误差 经验误差&#xff1a;模型对训练集数据的误差。泛化误差&#xff1a;模型对测试…