ROS1和ROS2的CMakeList模板

ROS入门之CmakeList.txt详讲 本文为进来学习的总结,记录了学习CmakeList.txt文档的各个步骤,适合从零开始理解CmakeList.txt,可能存在错误之处,望批评指正。 0 Cmake的起源 为什么有CmakeList.txt文档,这就要从C++说起了。在完成C++的代码之后想要把程序运行起来就需要把C++转换成可执行文件,具体来说,编译分为以下四个步骤: (1)预处理;(2)编译;(3)汇编;(4)链接。 具体来讲,我们可以把前三部看成一个黑盒,调用相应的指令就可以帮助... 阅读详情

一、ROS1(catkin)CMakeLists

① find_package()

find_package(catkin REQUIRED COMPONENTS
    roscpp
    mavros_msgs
    geometry_msgs
    tf
)
find_package(Eigen3 REQUIRED)

✔ 查找 ROS1 包
✔ 查找第三方库(Eigen)


②catkin_package + include_directories

catkin_package(
    CATKIN_DEPENDS roscpp mavros_msgs geometry_msgs tf
    INCLUDE_DIRS include
    LIBRARIES mavros_controller
)

include_directories(
    include
    ${catkin_INCLUDE_DIRS}
    ${EIGEN3_INCLUDE_DIRS}
)

✔ catkin_package:导出包信息给别人用
✔ include_directories:当前包自己需要的头文件


③ add_library + add_executable

add_library(${PROJECT_NAME}
    src/mavros_controller.cpp
)

add_executable(controller_node
    src/controller_node.cpp
)

✔ 一个生成库
✔ 一个生成节点可执行文件


④ install()

install(TARGETS controller_node
    RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
)

install(DIRECTORY include/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

✔ 安装可执行文件
✔ 安装库
✔ 安装头文件


二、ROS2(ament)CMakeLists

① find_package()

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(mavros_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(Eigen3 REQUIRED)

✔ 必须放在最前
✔ ROS2 包依赖结构更清晰


② add_library + add_executable

add_library(${PROJECT_NAME}
    src/mavros_controller.cpp
)

add_executable(controller_node
    src/controller_node.cpp
)

✔ 与 ROS1 相同:一个库一个节点
✔ 顺序可以互换


③ target_link_libraries + ament_target_dependencies

(1) 链接库(你自己写的库)

target_link_libraries(controller_node
    ${PROJECT_NAME}
)

(2) 添加依赖包(类似 include + link)

ament_target_dependencies(controller_node
    rclcpp
    mavros_msgs
    geometry_msgs
)

✔ “库依赖”与“包依赖”必须分离
✔ 这点是你最容易混淆和提问最多的内容:

ament_target_dependencies ≠ target_link_libraries
一个解决“包依赖”,一个解决“库链接”


④ install()

install(TARGETS
    ${PROJECT_NAME}
    controller_node
    DESTINATION lib/${PROJECT_NAME}
)

install(DIRECTORY include/
    DESTINATION include
)

ament_package()   # 必须最后

✔ 安装位置与 ROS1 不同
✔ ament_package() 一定要放在最后(你曾提问顺序是否可换)


三、踩坑记录


(1) 为什么 ROS2 有 target_link_libraries + ament_target_dependencies?

因为:

  • ament_target_dependencies: 负责 包依赖
  • target_link_libraries: 负责 目标库链接(你自己的库)

两者解决不同层面的问题,不能互相取代


(2) ROS2 为什么不直接用 include_directories?

  • 因为 target_include_directories 是现代 CMake 推荐写法
  • ament_target_dependencies 会自动添加包的 include 路径
  • 只有你自己的 include/ 需要手动写:
target_include_directories(${PROJECT_NAME}
    PUBLIC include
)

“为什么不能像 ROS1 那样写 include_directories?”
→ 因为 modern CMake 不推荐,且 TARGET 作用范围更明确。


(3) ROS2 的顺序能否随便写?

  1. find_package() 必须在最前
  2. 作用于某个 target 的设置必须写在 target 之后
  3. ament_package() 必须最后

其他顺序基本可以随意。


四、总结


ROS1 :三找、两包、两编译、一安装

三找(find_package)
两包(catkin_package + include_directories)
两编译(add_library + add_executable)
一安装(install)

ROS2 :三找 → 两建 → 两绑 → 一安装

三找(find_package)
两建(add_library + add_executable)
两绑(target_link_libraries + ament_target_dependencies)
一安装(install + 最后 ament_package)

五、ROS1和ROS2的CMakelist模板:

目录结构:

mavros_controller/
├── CMakeLists.txt
├── include/mavros_controller/mavros_controller.h
└── src/
    ├── mavros_controller.cpp
    └── controller_node.cpp

ROS1的CMakeLists.txt 模板

cmake_minimum_required(VERSION 3.0.2)
project(mavros_controller)

## ----------------------------------------
## 1. 编译选项
## ----------------------------------------
add_compile_options(-Wall -Wextra -Wpedantic -std=c++14)

## ----------------------------------------
## 2. 找依赖
## ----------------------------------------
find_package(catkin REQUIRED COMPONENTS
    roscpp
    mavros_msgs
    geometry_msgs
    tf
)

find_package(Eigen3 REQUIRED)

## ----------------------------------------
## 3. 打包导出
## ----------------------------------------
catkin_package(
    INCLUDE_DIRS include
    LIBRARIES mavros_controller
    CATKIN_DEPENDS roscpp mavros_msgs geometry_msgs tf
)

## ----------------------------------------
## 4. 头文件目录
## ----------------------------------------
include_directories(
    include
    ${catkin_INCLUDE_DIRS}
    ${EIGEN3_INCLUDE_DIRS}
)

## ----------------------------------------
## 5. 编译库
## ----------------------------------------
add_library(${PROJECT_NAME}
    src/mavros_controller.cpp
)

## 链接库
target_link_libraries(${PROJECT_NAME}
    ${catkin_LIBRARIES}
)

## ----------------------------------------
## 6. 编译节点
## ----------------------------------------
add_executable(controller_node
    src/controller_node.cpp
)

target_link_libraries(controller_node
    ${PROJECT_NAME}
    ${catkin_LIBRARIES}
)

## ----------------------------------------
## 7. 安装
## ----------------------------------------
install(TARGETS ${PROJECT_NAME} controller_node
    RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
)

install(DIRECTORY include/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

ROS2的CMakeLists.txt 模板

cmake_minimum_required(VERSION 3.8)
project(mavros_controller)

## ----------------------------------------
## 1. 编译选项
## ----------------------------------------
add_compile_options(-Wall -Wextra -Wpedantic -std=c++17)

## ----------------------------------------
## 2. 找依赖
## ----------------------------------------
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(mavros_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(Eigen3 REQUIRED)

## ----------------------------------------
## 3. 建库
## ----------------------------------------
add_library(${PROJECT_NAME}
    src/mavros_controller.cpp
)

## 头文件目录
target_include_directories(${PROJECT_NAME}
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
        ${EIGEN3_INCLUDE_DIRS}
)

## 绑定依赖
ament_target_dependencies(${PROJECT_NAME}
    rclcpp
    mavros_msgs
    geometry_msgs
    tf2
    tf2_ros
)

## ----------------------------------------
## 4. 建节点
## ----------------------------------------
add_executable(controller_node
    src/controller_node.cpp
)

target_include_directories(controller_node
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        ${EIGEN3_INCLUDE_DIRS}
)

## 绑定依赖
ament_target_dependencies(controller_node
    rclcpp
    mavros_msgs
    geometry_msgs
    tf2
    tf2_ros
)

## 节点需要链接库
target_link_libraries(controller_node
    ${PROJECT_NAME}
)

## ----------------------------------------
## 5. 安装
## ----------------------------------------
install(TARGETS
    ${PROJECT_NAME}
    controller_node
    DESTINATION lib/${PROJECT_NAME}
)

install(
    DIRECTORY include/
    DESTINATION include
)

## ----------------------------------------
## 6. ament 收工
## ----------------------------------------
ament_package()
使用Qt5为Ros项目添加GUI界面 开发ROS程序的过程中,有时需要给程序加一个Qt界面以方便操作,对于一个刚刚创建的ROS程序来说,添加qt界面需要对cmakelist.txt文件配置很多东西,许多人难就难在不会修改对应的cmakelist.txt文件上,下面是我根据网上资料整理的一份ROS+Qt5的工程创建方法,包括了从创建一个最基础的ros空间到添加界面的全过程。 系统环境:ubuntu16.04 ros版本:kineti... 阅读详情

相关推荐

VSCode断点调试(ROS)

中打ROS,可以自动补全ROS: Attach 或 ROS: Launch。其中,ROS: Attach 表示对一个可执行节点(node) debug,ROS: Launch 表示对一个launch 文件 debug。剩下的就跟pycharm差不多了,2处进行单步调试,3-4处进行变量监视(右键添加到监视),感觉比起pycharm变量很多不全的…,5处可对变量进行修改和计算,不需要加。,弹出一些模板,点默认gdb即可,会在.vscode文件夹下生成。,6处是程序的调用关系,7处切换终端等。

不知语冰 2080

ROS1&ROS2之CmakeList.txt和package.xml用法详解

目前还在学习ROS+无人机框架中,,,更多更新文章详见我的个人博客主页【

MGodmonkey的专属博客 7480

ROS-I学习笔记(4)-Action(2.Client)

Client的创建,衔接上文Server的创建。

D124lab的博客 1600

ROS 2机器人开发--CMakeLists.txt 文件详解

这个文件通常包括设置项目名称、版本号、语言标准、编译器选项、查找依赖包、添加可执行文件或库、链接依赖库、安装路径等。CMake 是一个跨平台的构建工具,不同的版本可能有不同的功能。这行代码确保用户使用的 CMake 版本不低于 3.5,以保证项目能够正确构建。这行代码添加一个可执行文件,talker 是可执行文件的名称,src/talker.cpp 是源文件的路径。这行代码定义了项目的名称。项目的名称在构建过程中会用到,例如生成的库或可执行文件的名称通常会包含项目名称。这行代码查找项目所需的依赖包。

qq_45591302的博客 1140

西工大noj100题python2024第一季1-10

【代码】西工大noj100题python2024第一季1-10。

weixin_70523540的博客 1781

Doris + Iceberg 实现高效数据湖分层:架构解析与最佳实践

本文深入解析了如何利用Doris与Iceberg构建高效的数据湖冷热分层架构。通过将高频访问的热数据存储在Doris中以实现毫秒级查询,同时将历史冷数据归档至低成本的Iceberg存储,该方案在保障查询性能的同时显著降低了总体拥有成本。文章详细阐述了从架构设计、自动化迁移到统一查询的最佳实践,为应对海量数据下的成本与性能平衡提供了实战指南。

weixin_29207533的博客 131

ros1的原始CMakeLists.txt文件备份

ros1的原始CMakeLists.txt文件备份。

weixin_45807759的博客 248

虚拟机VirtualBox下载与安装、安装Ubuntu超详细图文步骤,对一些配置问题也有所写。

自己使用过两款虚拟机,相较于VMware虚拟机来说,virtuabox虚拟机所占内存更小,只有几十兆,且完全开源不收费,里面的功能与VMware基本差不多(在日常开发、学习使用完全够用)。最主要的是,在博主自己使用VMware时经常出错,而virtualbox就更稳定一些,所以这篇是针对virtualbox的安装与一些细节部分。

l1015649309的博客 4万+

ROS工程CMAKE设置写法

参考:https://www.cnblogs.com/gaoxiang12/p/4633316.html Linux下的CMake项目通常由几个文件夹组成。例如我们今天讲的slam,你可以在机器上建一个叫slam的文件夹(注意:这个文件夹就是你代码的根目录了!)。然后往里面建几个子文件夹: bin 用来放编译好的可执行二进制文件。   src 用来放源代码。   lib 用来放编译好的库文件。   include 用来放头文件。 为什么要用这种目录结构呢?其实这是一种编译习惯,当然你可以把所有文件都搁一个

老李的博客 700

POI 写word,添加标题,表格,图片,自动生成目录,合并单元格

工程地址:https://github.com/zheng-chang-wei/word package com.example.demo1.poi; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.File; import java.io.FileOutputStream; public class ...

zheng_chang_wei的博客 6150

基于STM32的嵌入式平台实现EtherCAT主站

本文将介绍如何在基于STM32的嵌入式平台上构建EtherCAT主站,并提供相应的源代码。使用SOEM库提供的API函数,我们可以实现与EtherCAT从站设备的实时通信和数据交换。在STM32的代码中,使用SOEM库提供的API函数初始化EtherCAT主站。在SOEM库中,我们可以找到EtherCAT主站的实现代码和相关的API函数。使用SOEM库提供的API函数实现EtherCAT主站的功能,包括发送和接收EtherCAT数据帧、处理从站设备的状态等。确保连接正常并且设备能够相互通信。

CodeSageX的博客 2825

关于ROS包中CMakeList.txt中几个常用的命令的作用 ——————(二)

目录 (5)catkin_package() (6)add_library() (7)add_dependencies( []...) 接(一)https://blog.csdn.net/u012057432/article/details/103353547,以下是其他相关的配置命令,有些不是必要的,但是却十分常用,但是也是十分重要的。 (5)catkin_package() ...

u012057432的博客 732

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 3994

【ROS学习】ros系统中各通信机制的代码模板(C++实现)

ROS代码模板以及CMakeList文件配置

m0_72778902的博客 925

① Django手把手从零开发个人博客-前言

手把手教你从零开始玩转手把手教你从零开始玩转Django,全面学习并了解django的运行机制、开发全流程及线上部署。Django,全面学习并了解django的运行机制、开发全流程及线上部署。 专栏介绍 本套教程遵循Django的设计思想,开门见山,快速切入主题,拒绝拖沓,在实战中学习每一个知识点,提高学习的趣味性以及个人成就感,并且能快速将所学运用到实际项目中。 将从零手把手带着你一步步完成博客的每一个功能,通过实现博客文章列表页、文章详情页、作者页面等功能来学习和了解django的视图查询模块相关知.

轻编程的博客 506

【脑肿瘤分类与迁移学习技术】Swin UNETR:当 Swin Transformer 遇见 3D 医学图像分割——从黑盒到白盒的逐层拆解

医学图像分割的终极目标是让算法成为医生的可靠副手,而非黑箱替代品。理解 Swin UNETR 的每一层如何流动、每一个窗口如何移位、每一次拼接如何融合,不仅是为了调参,更是为了在临床场景中。

u012133341的博客 52

ros里的一些小tips——ros里多头文件和源文件的cmakelist.txt模板

ROS里多个头文件和源文件调用

qq_45391544的博客 454

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ROS系列实践1.2-工作空间架构理解

ROS系列实践(Ubuntu16.04,ROS-Kinetic)的学习笔记,第一部分第二节。ROS工作空间(catkin workspace)工程文件结构的初步理解,实践创建工作空间、创建包(package)、创建带有依赖的包。

JeremyZhao1998的博客 784

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ROS学习笔记6

两者区别是:不带devel后缀的package,通常只包含能让程序运行的动态库和配置文件。而带devel后缀的package,则包含使用这个package开发程序的所有的必需文件。因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),在RHEL上安装package时,经常看到同样名字的package有两个:分别是带和不带devel后缀的。*工作空间中写好的c++代码放在src中,编译好的可执行文件在devel中。上面是请求的数据类型,下面是反馈的数据类型,这里都是空。

m0_56428833的博客 916

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

CMakelist/package.xml文件模板

CMakelist cmake_minimum_required(VERSION 2.8.3) project(pcl_test) add_compile_options(-std=c++11) find_package(catkin REQUIRED COMPONENTS pcl_ros roscpp sensor_msgs ) find_package(PCL 1.7 REQUIRED) catkin_package( INCLUDE_DIRS include CATKIN_DEPEN

一点痕迹 436

ROS代码实现及基本操作

ROS 中,虽然实现同一功能时,C++ 和 Python 可以互换,但是具体选择哪种语言,视需求而定,因为两种语言相较而言:C++ 运行效率高但编码效率低,Python 则反之,基于两者互补的特点,ROS设计者分别设计了 roscpp 与rospy 库,前者旨在成为 ROS 高性能库,而后者一般用于对性能无要求的场景,旨在提高开发效率。上述命令,首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make 命令编译。先启动命令行1:需要ctrl+alt+t打开新的终端。

RosMaster的博客 970

ROS机器人制作(一)—— ROS基础以及配置文件

ROS笔记(一)1:工作空间的创建2:功能包3:CMakeList.txt文件4:package.xml文件5:roslaunch文件(1)node 标签(2)参数标签(3)group 标签(4)remap 标签 1:工作空间的创建 工作空间下一般有三个文件夹: build:编译过程的中间文件 src:代码文件 devel:编译生成的目标文件 (1) 创建文件夹 mkdir -p ~/1/src (2)进入文件夹 cd 1/src (3

Treasureljc的博客 682

ROS1--辟机器开源之荒途

简单来说在机器人领域中不同的机器人有不同的结构,总体虽然不一样,但是采用“模块化,分布式”的思想就可以将机器人分解成通用模块(雷达、双目、相机……)所以可以理解为ROS就是机器人界的安卓;ROS中的各种节点就相当于各种手机的app,任何可以用单片机控制的模块都能用ROS来实现;1、启动终端:简单的有两种方式,第一种:在左下角的显示应用程序里直接打开终端,第二种:使用快捷键ctrl+alt+t来调出来终端。显示出来像下边图片中的窗口就恭喜你会启动linux系统的终端了!!!2、对文件进行操作:查看当前文件夹的

2502_93181420的博客 1181

使用QT编写ROS订阅、发布程序

Linux下一直使用QT进行开发,支持cmake使得很容易导入其他工程。学习ROS过程中,很多函数名称难记,使用QT不仅可以提示补全,还为了以后开发GUI方便吧。 1、安装ros_qtc_plugin 首先安装Qt,Qt我安装的是5.5.1版本,直接下载run文件安装即可。同样,ros_qtc_plugin我也是直接下载run运行安装。安装完成后在Terminal可以见到有qtcreator...

weixin_40721097的博客 1106

ros搭建学习心得

在自定义ROS包中,无法创建新建文档,打开主目录中的模板文件夹,右键在终端中打开,使用sudo gedit 新建文本文档.txt指令生成一个文本保存即可,使用拼音输入法需先安装百度输入法;使用终端在主目录创建工作空间,mkdir -p 空间名/src,得到目标文件夹,使用cd指令选中创建文件夹,执行catkin_make进行编译。注意编辑ros包下的Cmakelist.txt文件之前,避免使用的c语言文件名与其所在文件夹名重复,以便于区分。2.helloworld实现,创建工作空间,使用c++编写程序。

myslmt0729的博客 291

Python和C++程序发布和订阅ROS话题

使用ROS框架并不需要一定是ROS的包,只需要包含ROS相关的库以及头文件即可。Python语言可以直接import相应的ROS模板,C++只需要指明ROS的路径即可。

持久决心的博客 7980
上一篇: CMake工具基本使用及跨平台(Windows、Linux)安装yaml-cpp
下一篇: CMakeList.txt模板与 Visual Studio IDE 操作对比表
小坏坏的大世界
博客等级 码龄12年 1289粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值