0. 前言

在 ROS 中,节点的编写语言通常只有 C++ 和 Python,C++ 需要编译后才能运行,Python 则无需编译。

我们知道 Linux 平台编译 C++ 文件,需要编译器和链接器,其中编译器是将源代码编译成目标代码,链接器是将目标代码链接到可执行文件。若是编译单个文件,用 g++ 即可;若是编译一个 C++ 工程,则需要批处理编译工具,如 make,通过设定规则文件 makefile 调用 g++ 等编译工具进行批量编译。但 makefile 的编写十分复杂,便诞生了 CMake,通过编写简单的 CMakeLists.txt 规则文件,就能自动生成 makefile 文件,并且 CMake 是跨平台的,十分强大。可参考之前的博客:

Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake​www.cnblogs.com

ROS 的编译器便是 CMake,为了更加人性化,ROS 在 CMake 基础上封装了 catkin 命令,用 cmake 命令创建功能包时,会自动生成 CMakeList.txt 文件,已配置了多数编译选项,且包含详细的注释,只需稍作修改便可编译自己的文件。

而 package.xml 文件是描述功能包清单的文件,包括功能包的名称、版本号、作者信息、许可信息、编译依赖和运行依赖等。

我们在用 catkin_create_pkg 命令创建功能包时,是会自动生成 CMakeLists.txt 和 package.xml 文件的。

举例:

# 创建工作空间
mkdir -p ~/catkin_ws/src

下面看下 CMakeLists.txt 文件和 package.xml 文件各有哪些内容,需要自己改动哪些地方。

1. CMakeLists.txt 文件

常用的编译配置项如下:

(1)include_directories

  • 用于设置头文件的相对路径
  • 全局路径默认为功能包所在目录,功能包的头文件一般放在功能包根目录下的 include 文件夹,所以需要此处添加此文件夹
  • 还包含 catkin 编译器默认的其他头文件路径,如:ROS 默认安装路径、Linux 系统路径等

(2)add_exectuable

  • 用于设置需要编译的代码和可执行文件
  • 第一个参数为期望生成的可执行文件(节点)名称
  • 后面的参数为参与编译的源文件(.cpp),若需要多个代码文件,可依次列出,空格分隔

(3)target_link_libraries

  • 用于设置链接库
  • 有些功能需要使用系统或第三方库函数,通过该选项可以配置执行文件链接的库文件
  • 第一个参数与 add_exectuable 相同,为可执行文件(节点)名称
  • 后面的参数为需要链接的库,依次列出,空格分隔

(4)add_dependencies

  • 用于设置依赖
  • 有时候需要自定义消息类型,消息类型会在编译过程中产生相应语言的代码。若编译的可执行文件依赖这些动态生成的代码,则需要添加 ${PROJECT_NAME}_generate_messages_cpp 配置

(5)自定义数据类型:消息 msg、服务 srv、动作 action

  • find_package(catkin REQUIRE COMPONENTS message_generation)
  • catkin_package(CATKIN_DEPENDS message_runtime)
  • add_message_files(FILES xxx.msg)
  • add_service_files(FILES xxx.srv)
  • add_action_files(FILES xxx.action)
  • generate_messages(DEPENDENCIES std_msgs)

模板:

cmake_minimum_required

2. package.xml 文件

  • <build_depend></build_depend> 标签定义了功能包中代码编译时所依赖的其他功能包
  • <exec_depend></exec_depend> 标签定义了功能包中可执行程序运行时所依赖的其他功能包
  • 自定义数据类型:话题消息 msg、服务数据 srv,需添加
<build_depend>message_generation

模板:

<?xml version="1.0"?>

用于创建此对象的程序是package_【ROS 学习笔记】CMakeLists.txt 与 package.xml相关推荐

  1. 在Word文档中插入Excel表格时出现:“用于创建此对象的程序是Excel。您的计算机尚未安装此程序。”试试这个方法

    出现这个错误提示,别急这去重装OFFICE套装,先试试这个方法: 1.右键点击Word,属性,兼容性,取消所有勾选选项. 2.右键点击Excel,属性,兼容性,取消所有勾选选项. 我是用这个方法弄好的 ...

  2. ROS学习笔记三:编写第一个ROS节点程序

    在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package). 一.创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次性创 ...

  3. ROS学习笔记三:创建ROS软件包

    ,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...

  4. Mobl——用于创建HTML移动应用程序的新DSL

    Mobl--用于创建HTML移动应用程序的新DSL 作者 Abel Avram译者 侯伯薇发布于 2011年2月12日 下午6时44分 http://www.infoq.com/cn/news/201 ...

  5. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

  6. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  7. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  8. 计算机、程序和 Java 概述 学习笔记

    计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. 计算机包括硬件( hardware ) 和软件( software) ...

  9. 【黑马程序员新版Linux学习笔记】Linux系统实用操作命令——操作演示

    [黑马程序员新版Linux学习笔记]Linux 零基础快速入门: (一)Linux基本命令--操作演示 (二)Linux用户和权限 -- 操作演示 (三)Linux 小技巧快捷键 (四)Linux系统 ...

最新文章

  1. linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
  2. 测试数据库sql声明效率
  3. 【机器学习入门笔记10:TensorFlow矩阵基础】20190217
  4. php ssl 不验证失败,php – 没有SSL的安全身份验证
  5. 云服务器装哪些版本的系统好,云服务器按装什么系统好
  6. oracle重置sys密码
  7. 输入班级人数,根据人数,挨个输入成绩,求平均分,求最高分最低分
  8. 程序员如何才配拥有姓名?
  9. 飞凌单片机解密_干货:芯片解密方法大全
  10. MDM平台UI升级功能说明
  11. 按自己的思想写商业计划
  12. 西南农业大学成教学院有计算机专业吗,西南农业大学计算机应用与技巧网上功课及答案...
  13. list.stream().map().collect(Collectors.toList())
  14. 使用android studio设置签名信息
  15. 服务器网站监控报表,宝塔面板网站监控报表实时分析网站日志
  16. html360全景图原理,HTML5中Canvas如何实现360度全景图
  17. 领导力/行为面试必备技能 - STAR 法则
  18. 一个简单的UDP回显服务器
  19. 1.已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
  20. 标签体系下的用户画像建设小指南

热门文章

  1. C/C++ OpenCV图像的尺寸变化
  2. mysql 安装1607_mysql服务启动报1607error
  3. java发送消息_通过java给qq邮箱发送信息
  4. c语言从html控件sscanf,sscanf与sprintf在C语言中的用法
  5. android opengl es 粒子效果实例代码
  6. java如何编写年月_如何从Java中的日历对象构建天,月,年的列表?
  7. java final属性
  8. 数据结构之线索二叉树
  9. 数据库事务及事务的特征
  10. Ubuntu关于apt-get remove与apt-get purge