【ROS】 CMakeLists 文件详解
【ROS】 CMakeLists文件详解
- 前言
- 标准的CMAKELIST.TXT文件的组成部分
- CMake 版本要求和项目名称
- 指定编译器和设置构建规则
- 查找 ROS 依赖
- 消息和服务文件
- catkin_package
- 设置头文件目录路径
- 添加可执行文件的构建规则
- 设置编译依赖关系(构建顺序)
- 设置目标文件的链接库
- 其他规则
- 示例文件
前言
在 ROS 的学习过程中,即使主要使用 Python 进行开发,仍然会频繁涉及 CMakeLists.txt 文件。因此,本文将简要介绍 CMakeLists.txt 的相关知识,并通过示例加以说明。
在深入了解 CMakeLists.txt 之前,我们首先需要理解它与 CMake、Make、GCC、G++、NVCC 之间的关系,以及 .c、.cpp、.o、.so、.a 等文件的作用。此外,还需掌握 编译、链接、构建、目标文件和可执行文件 等相关概念,以便更好地理解 CMakeLists.txt 的作用和使用方式。
有关这些概念的详细介绍,可以参考以下文章:
- 【编译、链接与构建详解】Makefile 与 CMakeLists 的作用。
标准的CMAKELIST.TXT文件的组成部分
一个标准的 ROS CMakeLists.txt 文件通常包含以下几个部分,每个部分负责不同的配置和设置:
CMake 版本要求和项目名称
- 指定 CMake 的最低版本要求
- 定义项目的名称
# 指定所需的 CMake 最低版本(>=2.8.3)
cmake_minimum_required(VERSION 2.8.3)# 定义项目名称为 'xf_mic_asr_offline'
project(xf_mic_asr_offline)
指定编译器和设置构建规则
- 指定编译器版本
- 设置构建规则
# 启用 C++11 标准支持
# 说明:指定编译器使用 C++11 标准进行代码编译
add_compile_options(-std=c++11)# 配置 C++ 编译器标志
# 说明:在现有的编译标志基础上添加 -g 选项,支持调试信息的生成
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")# 开启详细构建输出
# 说明:设置 CMake 在构建过程中显示完整的编译和链接命令
set(CMAKE_VERBOSE_MAKEFILE ON)
查找 ROS 依赖
- 使用
find_package查找并加载 ROS 依赖包。如果缺少必要的依赖包,构建过程将报错。
# 查找并加载项目依赖的外部包
# find_package 命令格式:find_package(<包名> [REQUIRED] [[COMPONENTS] [组件1] [组件2] ...])
# 参数说明:
# - REQUIRED:表示该包是必需的,若找不到将导致编译失败
# - COMPONENTS:用于指定需要加载的具体组件find_package(catkin REQUIRED COMPONENTSroscpp # ROS 的 C++ 客户端库rospy # ROS 的 Python 客户端库std_msgs # ROS 标准消息库message_generation # ROS 消息生成工具
)
消息和服务文件
- 定义自定义的消息和服务文件的位置。(官方提供的消息和服务文件无需添加,如
std_msgs) - 定义自定义消息和服务所依赖的 ROS 官方消息包(例如,自定义的消息文件如果依赖于
std_msgs.msg,则需要在generate_messages中添加std_msgs)。
# 添加自定义消息文件
# 说明:指定项目中需要编译的自定义消息文件 (.msg)
# 注意:仅需添加在 msg 目录下的自定义消息文件,无需添加 ROS 自带的消息文件
add_message_files(FILESPcm_Msg.msg # PCM 音频数据消息
)# 添加自定义服务文件
# 说明:指定项目中需要编译的自定义服务文件 (.srv)
# 注意:仅需添加在 srv 目录下的自定义服务文件,无需添加 ROS 自带的服务文件
add_service_files(FILESGet_Offline_Result_srv.srv # 获取离线识别结果服务Set_Major_Mic_srv.srv # 设置主麦克风服务Get_Major_Mic_srv.srv # 获取主麦克风服务Start_Record_srv.srv # 开始录音服务Set_Awake_Word_srv.srv # 设置唤醒词服务Set_Led_On_srv.srv # 设置 LED 开关服务Get_Awake_Angle_srv.srv # 获取唤醒角度服务
)# 生成消息和服务的接口代码
# 说明:根据上述定义的消息和服务文件生成对应的代码实现
# 参数说明:
# DEPENDENCIES:指定消息生成时依赖的其他消息包
# std_msgs:标准消息包,提供基础数据类型的消息定义
generate_messages(DEPENDENCIESstd_msgs
)
catkin_package
catkin_package用于配置当前 ROS 功能包的依赖关系及导出项,声明当前包所依赖的其他功能包以及需要导出的文件(如头文件、库文件等),供其他功能包使用。
# catkin_package 函数用于配置当前 ROS 功能包的依赖和导出项
# 函数格式说明:
# catkin_package(CATKIN_DEPENDS [依赖的 ROS 包...] DEPENDS [依赖的系统库...] INCLUDE_DIRS [导出的头文件路径...] LIBRARIES [导出的库文件...])# 参数说明:
# CATKIN_DEPENDS:声明对其他 ROS 包的依赖
# DEPENDS:声明对系统库或非 catkin 包的依赖
# INCLUDE_DIRS:声明本包导出的头文件路径
# LIBRARIES:声明本包导出的库文件路径catkin_package(CATKIN_DEPENDS message_runtime # 依赖 message_runtime 包用于消息运行时支持LIBRARIES libmsc.so # 导出 libmsc.so 库# INCLUDE_DIRS include # 此行被注释,不导出头文件# CATKIN_DEPENDS roscpp rospy sensor_msgs std_msgs # 此行被注释,不使用这些 ROS 包依赖# DEPENDS system_lib # 此行被注释,不使用系统库依赖
)
设置头文件目录路径
- 使用
include_directories函数来指定编译时的头文件搜索路径。
# include_directories 用于指定编译时的头文件搜索路径
# 函数格式:include_directories([AFTER|BEFORE] [SYSTEM] <目录1> <目录2> ...)
# 参数说明:
# AFTER|BEFORE:可选参数,指定新路径在系统默认搜索路径前还是后添加
# SYSTEM:可选参数,将目录标记为系统目录,编译器会优先搜索
# 目录路径说明:
# include:项目本地头文件目录,通常指向项目的 include 目录
# ${catkin_INCLUDE_DIRS}:ROS 依赖包的头文件目录,包含所有 CATKIN_DEPENDS 声明的包include_directories(include # 本项目的本地头文件目录${catkin_INCLUDE_DIRS} # ROS 依赖包的头文件目录
)
添加可执行文件的构建规则
- 使用
add_executable函数定义源文件和生成的可执行文件。
# add_executable 用于生成可执行文件
# 函数格式:add_executable(<可执行文件名> [源文件1 源文件2 ...])
# 本例说明:
# 将 src/hid_test_auto.cpp 编译为可执行文件 xf_asr_offline_node
# 该 cpp 文件包含 main 函数入口,是 ROS 节点的主程序文件add_executable(xf_asr_offline_node src/hid_test_auto.cpp)
设置编译依赖关系(构建顺序)
- 设置编译依赖关系有助于确保构建顺序的正确性,自动确定各个目标文件的构建顺序。
# add_dependencies 用于设置目标文件的编译依赖关系
# 函数格式:add_dependencies(<目标文件> <依赖项1> <依赖项2> ...)
# 参数说明:
# 目标文件:可以是可执行文件、动态库、静态库等
# 依赖项:指定目标文件依赖的其他目标,如其他库文件、自动生成的消息代码等add_dependencies(xf_asr_offline_node # 目标文件:语音识别节点的可执行文件${xf_mic_package_EXPORTED_TARGETS} # 依赖项:导出的目标文件xf_mic_asr_offline_gencpp # 依赖项:自动生成的 C++ 消息代码
)
设置目标文件的链接库
- 通过设置目标文件的链接库,可以指定目标文件链接的
.o目标文件以及静态或动态库,提高代码复用性。
# target_link_libraries 用于设置目标文件的链接库
# 函数格式:target_link_libraries(<目标文件> [库1 库2 ...])
# 链接库分类:
# - ROS 依赖库:${catkin_LIBRARIES} # ROS 相关的库文件
# - 自定义动态库:
# - msc # 语音识别库 libmsc.so
# - offline_record_lib # 离线录音库 liboffline_record_lib.so
# - hid_lib # HID 设备库 libhidapi.so
# - 系统动态库:
# - rt # 实时库
# - dl # 动态链接库
# - pthread # POSIX 线程库
# - stdc++ # C++ 标准库target_link_libraries(xf_asr_offline_node ${catkin_LIBRARIES} # ROS 库msc # 语音识别库offline_record_lib # 离线录音库hid_lib # HID 设备库rt # 实时库dl # 动态链接库pthread # 线程库stdc++ # C++ 标准库
)
其他规则
在 ROS 中,诸如安装规则、版本控制、单元测试配置等其他构建规则使用较少,因此本文将不再详细讨论。
示例文件
#指定CMake最低版本要求
cmake_minimum_required(VERSION 2.8.3)
#定义项目名称
project(xf_mic_asr_offline)#设置编译选项
add_compile_options(-std=c++11) #使用C++11标准
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") #添加调试信息
set(CMAKE_VERBOSE_MAKEFILE ON) #显示详细的构建信息#查找所需的功能包
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)#根据CPU架构选择对应的库文件目录
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")message("-- 当前cpu架构: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message("-- 使用lib/x64/库")link_directories(lib/x64)
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")message("-- 当前cpu架构: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message("-- 使用lib/arm64/库")link_directories(lib/arm64)
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch32")message("-- 当前cpu架构: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message("-- 使用lib/arm32/库")link_directories(lib/arm32)
else()message("-- 当前cpu架构: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message("-- 使用默认lib/x64/库,如不正确请修改xf_mic_asr_offline/CMakeLists.txt")link_directories(lib/x64)
endif()#添加消息文件
add_message_files(FILESPcm_Msg.msg
)#添加服务文件
add_service_files(FILESGet_Offline_Result_srv.srvSet_Major_Mic_srv.srvGet_Major_Mic_srv.srvStart_Record_srv.srvSet_Awake_Word_srv.srvSet_Led_On_srv.srvGet_Awake_Angle_srv.srv
)#生成消息和服务的依赖项
generate_messages(DEPENDENCIESstd_msgs
)#配置功能包
catkin_package(CATKIN_DEPENDS message_runtimeLIBRARIES libmsc.so
)#设置头文件目录
include_directories(include${catkin_INCLUDE_DIRS}
)#第一个节点的编译配置
#添加可执行文件
add_executable(xf_asr_offline_node src/hid_test_auto.cpp)
#添加依赖关系
add_dependencies(xf_asr_offline_node${xf_mic_package_EXPORTED_TARGETS}xf_mic_asr_offline_gencpp
)
#添加链接库
target_link_libraries(xf_asr_offline_node ${catkin_LIBRARIES} msc offline_record_lib hid_lib rt dl pthread stdc++
)#第二个节点的编译配置
#添加可执行文件
add_executable(client_node src/client.cpp)
#添加依赖关系
add_dependencies(client_node${xf_mic_package_EXPORTED_TARGETS}xf_mic_asr_offline_gencpp
)
#添加链接库
target_link_libraries(client_node ${catkin_LIBRARIES} offline_record_lib hid_lib rt dl pthread stdc++
)
相关文章:
【ROS】 CMakeLists 文件详解
【ROS】 CMakeLists文件详解 前言标准的CMAKELIST.TXT文件的组成部分CMake 版本要求和项目名称指定编译器和设置构建规则查找 ROS 依赖消息和服务文件catkin_package设置头文件目录路径添加可执行文件的构建规则设置编译依赖关系(构建顺序)设置目标文件的…...
【每日算法】Day 17-1:位图(Bitmap)——十亿级数据去重与快速检索的终极方案(C++实现)
解锁海量数据处理的极致空间效率!今日深入解析位图的核心原理与实战应用,从基础操作到分块优化,彻底掌握仅用1bit存储一个数据的压缩艺术。 一、位图核心思想 位图(Bitmap) 是一种通过比特位表示数据存在性的数据结构…...
7-1 素数求和(线性筛实现)
7-1 素数求和。 分数 10 中等 全屏浏览 切换布局 作者 魏英 单位 浙江科技大学 输入两个正整数m和n(1<m<n<500)统计并输出m和n之间的素数个数以及这些素数的和。 输入格式: 输入两个正整数m和n(1<m<n<500࿰…...
NLP简介及其发展历史
自然语言处理(Natural Language Processing,简称NLP)是人工智能和计算机科学领域中的一个重要分支,致力于实现人与计算机之间自然、高效的语言交流。本文将介绍NLP的基本概念以及其发展历史。 一、什么是自然语言处理?…...
ZKmall开源商城多云高可用架构方案:AWS/Azure/阿里云全栈实践
随着企业数字化转型的加速,云计算服务已成为IT战略中的核心部分。ZKmall开源商城作为一款高性能的开源商城系统,其在多云环境下的高可用架构方案备受关注。下面将结合AWS、Azure和阿里云三大主流云平台,探讨ZKmall的多云高可用架构全栈实践。…...
优化 Web 性能:处理非合成动画(Non-Composited Animations)
在 Web 开发中,动画能够增强用户体验,但低效的动画实现可能导致性能问题。Google 的 Lighthouse 工具在性能审计中特别关注“非合成动画”(Non-Composited Animations),指出这些动画可能增加主线程负担,影响…...
Eliet Chat开发日志:信令服务器注册与通信过程
目录 1. 架构设计:信令服务器与客户端 2. 选择技术栈 3. 实现信令服务器 4. 客户端实现 5. 测试 6. 下一步计划 日期:2025年4月5日 今天的工作重点是实现两个设备通过信令服务器注册并请求对方公网地址信息,以便能够进行点对点通信。我…...
leetcode二叉树刷题调试不方便的解决办法
1. 二叉树不易构建 在leetcode中刷题时,如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤,那就是二叉树的题。 要调试二叉树有关的题需要根据测试用例给出的前序遍历,自己构建一个二叉树,…...
颜色性格测试:探索你的内在性格色彩
颜色性格测试:探索你的内在性格色彩 在我们的日常生活中,颜色无处不在,而我们对颜色的偏好往往能反映出我们内在的性格特质。今天我要分享一个有趣的在线工具 —— 颜色性格测试,它能通过你最喜欢的颜色来分析你的性格倾向。 &…...
hashtable遍历的方法有哪些
在 Java 中,遍历 Hashtable(或其现代替代品 HashMap)有多种方式,以下是 6 种常用方法的详细说明和代码示例: 1. 使用 keySet() 增强 for 循环 Hashtable<String, Integer> table new Hashtable<>(); // …...
CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
目录 一、背景知识二、使用方法(一)安装扩展(二)创建 CMake 项目(三)编写代码(四)配置 CMakeLists.txt(五)生成构建文件(六)开始调试 …...
浅谈ai - Activation Checkpointing - 时间换空间
前言 曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰! Activation Checkpointing(激…...
提高MCU的效率方法
要提高MCU(微控制器单元)的编程效率,需要从硬件特性、代码优化、算法选择、资源管理等多方面入手。以下是一些关键策略: 1. 硬件相关优化 时钟与频率: 根据需求选择合适的时钟源(内部/外部振荡器),避免过高的时钟频率导致功耗浪费。关闭未使用的外设时钟(如定时器、UA…...
5G从专家到小白
文章目录 第五代移动通信技术(5G)简介应用场景 数据传输率带宽频段频段 VS 带宽中低频(6 GHz以下):覆盖范围广、穿透力强高频(24 GHz以上):满足在热点区域提升容量的需求毫米波热点区…...
神经网络入门:生动解读机器学习的“神经元”
神经网络作为机器学习中的核心算法之一,其灵感来源于生物神经系统。在本文中,我们将带领大家手把手学习神经网络的基本原理、结构和训练过程,并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者…...
web漏洞靶场学习分享
靶场:pikachu靶场 pikachu漏洞靶场漏洞类型: Burt Force(暴力破解漏洞)XSS(跨站脚本漏洞)CSRF(跨站请求伪造)SQL-Inject(SQL注入漏洞)RCE(远程命令/代码执行)Files Inclusion(文件包含漏洞)Unsafe file downloads(不安全的文件下载)Unsafe file uploads(不安全的文…...
vue watch和 watchEffect
在 Vue 3 中,watch 和 watchEffect 是两个用于响应式地监听数据变化并执行副作用的 API。它们在功能上有一些相似之处,但用途和行为有所不同。以下是对 watch 和 watchEffect 的详细对比和解释: 1. watch watch 是一个更通用的 API…...
函数和模式化——python
一、模块和包 将一段代码保存为应该扩展名为.py 的文件,该文件就是模块。Python中的模块分为三种,分别为:内置模块、第三方模块和自定义模块。 内置模块和第三方模块又称为库内置模块,有 python 解释器自带,不用单独安…...
Python解决“数字插入”问题
Python解决“数字插入”问题 问题描述测试样例解题思路代码 问题描述 小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。 你…...
Go语言的嵌入式网络
Go语言的嵌入式网络 引言 在当今快速发展的互联网时代,嵌入式系统和网络技术的结合变得越来越普遍。嵌入式系统是指嵌入到设备中以实现特定功能的计算机系统,它们通常具有资源有限的特点。随着物联网(IoT)的兴起,嵌入…...
Dart 语法
1. 级联操作符 … var paint Paint()..color Colors.black..strokeCap StrokeCap.round..strokeWidth 5.0;2. firstWhereOrNull 3. 隐藏或导入部分组件 // Import only foo. import package:lib1/lib1.dart show foo;// Import all names EXCEPT foo. import package:lib…...
MCP over MQTT:EMQX 开启物联网 Agentic 时代
前言 随着 DeepSeek 等大语言模型(LLM)的广泛应用,如何找到合适的场景,并基于这些大模型构建服务于各行各业的智能体成为关键课题。在社区中,支持智能体开发的基础设施和工具层出不穷,其中,Ant…...
ACM代码模式笔记
系列博客目录 文章目录 系列博客目录1.换行符 1.换行符 nextInt()、nextDouble() 等不会消耗换行符: 当使用 nextInt() 或 nextDouble() 读取数字时,它只读取数字部分,不会消耗掉输入后的换行符。 nextLine() 会读取并消耗换行符:…...
相干光信号处理的一些基础知识
1. 逆琼斯矩阵问题 逆琼斯矩阵方法常用于逆向补偿由光学系统或传输信道(如光纤)引入的偏振态(SOP, State of Polarization)畸变。 1.1 琼斯向量 任意偏振光可用二维复数向量表示: E [ E x E y ] [ ∣ E x ∣ e i…...
WiFi加密协议
目录 1. 认证(Authentication) 1.1 开放系统认证(Open System Authentication) 1.2 共享密钥认证(Shared Key Authentication) 1.3 802.1X/EAP认证(企业级认证) 2. 关联(Association) 3. 加密协议(Security Handshake) 整体流程总结…...
程序化广告行业(61/89):DSP系统活动设置深度剖析
程序化广告行业(61/89):DSP系统活动设置深度剖析 大家好!在程序化广告的学习道路上,我们已经探索了不少重要内容。今天依旧本着和大家一起学习进步的想法,深入解析DSP系统中活动设置的相关知识。这部分内容…...
[王阳明代数讲义]具身智能才气等级分评价排位系统领域投射模型讲义
具身智能才气等级分评价排位系统领域投射模型讲义 具身智能胆识曲线调查琴语言的行为主义特性与模式匹配琴语言的"气质邻域 "与气度,云藏山鹰符号约定 琴语言的"气质邻域 "与气度,一尚韬竹符号约定 琴语言的"气质邻域 "与…...
【Block总结】PlainUSR的局部注意力,即插即用|ACCV2024
论文信息 标题: PlainUSR: Chasing Faster ConvNet for Efficient Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguang Liu发表时间: 2024年会议/期刊: 亚洲计算机视觉会议(ACCV 2024)研究背景: 超分辨率(Super-Resolution, S…...
Kubernetes集群管理详解:从入门到精通
1. 引言 Kubernetes(简称k8s)作为当今最流行的容器编排平台,已成为云原生应用部署和管理的事实标准。本文将深入探讨k8s集群管理的各个方面,为运维工程师和开发人员提供一个全面的指南。 2. Kubernetes架构概览 在深入具体的管理任务之前,让我们先回顾一下Kubernetes的基本架…...
Git 换行符警告(LF replaced by CRLF)的解决方案
根据你的日志和知识库中的信息,以下是针对 Git 换行符警告(LF replaced by CRLF) 的解决方案: 一、问题分析 警告原因 你当前在 Windows 系统 上工作,但某些文件(如 .gitignore, README.md, package.json 等…...
