“CMake实践”教程,可以自行下载学习
链接: https://pan.baidu.com/s/1sFsR_-57WgY-cUeD5U1LkQ 提取码: fvj3


一.catkin编译系统


1.catkin概述

catkin是ROS的官方编译系统,是ros原始编译系统build的继承者。catkin相比于build来讲操作更加简化且工作效率更高,可移植性更好,且支持交叉编译和更加合理的功能包分配。

2.catkin编译的工作流程

首先在工作空间的src目录下递归的查找每一个ros的package。因为每一个package中都有package.xml和CMakeList.txt文件,所以catkin编译系统依据CMakeList.txt文件,生成makefile文件,放在工作空间的build文件夹中。然后make刚刚生成的makefiles等文件,编译链接生成可执行文件,放在工作空间下的devel文件夹中。简而言之,catkin就是将camke和make指令做了一个封装从而完成整个编译过程的工具。

3.catkin的特点

catkin是基于CMake的编译构建系统,其沿用了包管理的传统基础结构,扩展了CMake.

一个catkin的package必须包括package.xml和CMakeList.txt这两个文件

package.xml:定义了package的属性(包的自我描述),如包名、版本号、作者、依赖等

CMakeList.txt:规定了catkin的编译规则,是构建package所需的CMake文件,具体的有:调用catkin的函数/宏;解析package.xml;找到其他依赖的catkin软件包;将本软件包添加到环境变量等等

4.使用catkin_make进行编译

常用的catkin命令:

catkin_create_pkg  创建一个包含package.xml和CMakeList.txt文件的空功能包

$catkin_create_pkg package_name depend1 depend2

catkin_make 创建和初始化工作空间,编译

catkin_generate_changelog 该命令是在更新功能包的版本时创建一个描述更新记录的CHANGELOG.rst文件

catkin_prepare_release 准备发布时用到的更新记录和版本标记

在把创建的功能包注册到官方ROS存储库或更新功能包的版本时,会使用到上面两个命令。

catkin_find 搜索catkin,找到并显示工作空间,可通过运行该命令来找出正在使用的所有工作目录,如果执行“catkin_find package_name”,则会看到选项中指定的与功能包相关的工作目录

用catkin编译一个工程或软件包只需要用catkin_make指令。一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。

 

二.package.xml(功能包配置文件)


package.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。

文件写法:遵循XML标签文本的写法,目前存在两种格式,但内容大致一样。(红色字体的是必备标签)

<!--注释内容-->

<?xml>                                 定义文档语法的语句,放在文档开头

<package>                           根标记文件

<name>                                包名

<version>                              版本号

<description>                        功能包的简要说明,通常两三句话说明

<maintainer>                         维护者,提供其姓名和电子邮件地址

<license>                               版本许可证

<url>                                      记录描述功能包的说明,如网页、错误管理、存储库的地址等      

<author>                                记录参与功能包开发的开发人员的姓名和电子邮箱地址,如涉及多位则在下一行添加<author>标签

<buildtool_depend>               描述构建系统的依赖关系,通常是catkin

<build_depend>                     编译功能包时所需的依赖项

<run_depend>                        运行功能包是所需的依赖名称

<exec_depend>                      与<run_depend>功能相同

<run_depend>是旧版本的,<exec_depend> 是新版本的,需要注意区分但又要知道二者功能相同

<depend>                               指定依赖项为编译、导出、运行需要的依赖(最常用)(新版本的)

新版本用<depend>来整合<build_depend>和<run_depend>,因为这二者会存在一些相同的依赖包,所以将这些相同的依赖包整合到<depend>中,而各自不同的再分别用<build_depend>、<run_depend>列出

<build_export_depend>         导出依赖项

<test_depend>                       测试功能包时所需的依赖名称

<doc_depend>                       文档的依赖项

<export>                                 在使用ROS中未指定的标签名称时会用到该标签,最广泛使用的情况是元功能包的情况,

                                                <export><metapackage/></export>格式表明是元功能包

<metapackage>                      在export标签中使用的官方标签声明,当前功能包为一个元功能包时声明它

例子:

从例子中可以明显看出新旧版本的差别

特别要注意<maintainer>和<url>的格式

<maintainer email="dthomas@osrfoundation.org">Dirk Thomas</maintainer>

<url type="website">http://www.ros.org/wiki/turtlesim</url>

三.CMakeList.txt(构建配置文件)

CMakeList.txt原本是Cmake编译系统的规则文件,ROS的构建系统catkin基本上使用CMake,只是针对ROS工程添加了一些宏定义。因此在写法上CMakeList.txt和Cmake基本一致。

CMakeList.txt文件规定了catkin的编译规则,直接规定这个包需要依赖那些package,要编译生成那些目标,如何编译等等流程

写法:该文件的基本语法都是按照CMake,只是在其基础上添加了一些宏

总体结构

camke_minimum_required()    #CMake的版本号,指定系统中安装的CMake的最低版本,如比规定的低则必须要更新版本

             例 cmake_minimum_required(VERSION2.8.3)  指定最低版本是2.8.3

project()                                        #项目的名称,必须要使用package.xml中的<name>标记中的功能包名称

find_package()                             #进行构建所需的组件包,这是让用户先创建依赖包的选项

            例 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)  #roscpp和std_msgs被添加为依赖包

                如果是使用ROS以外的功能包时有一定区别,如使用Boost时,必须先安装system功能包

                find_package(Boost REQUIRED COMPONENTS sysytem)

catkin_python_setup()                #catkin新加宏,打开catkin的Python Module的支持,调用Python安装过程setup.py

add_message_files()                   #catkin新加宏,添加自定义Message文件

            例 add_message_files(FILES Message1.msg Message2.msg)    FILES将引用当前功能包目录的msg目录中的

                *.msg文件,自动生成一个头文件(*.h)

add_service_files()                       #catkin新加宏,添加自定义Service文件

            例 add_service_files(FILES service1.srv service2.srv)   FILES将引用当前功能包目录的srv目录中的

                 *.srv文件

add_action_files()                        #catkin新加宏,添加自定义Action文件

generate_message()                    #catkin新加宏,生成不同语言版本的mag/srv/action接口

catkin_package()                         #catkin新加宏,生成当前package的cmake配置,供依赖本包的其它软件包调用

            例 catkin_package(

                INCLUDE_DIRS inlude   #使用INCLUDE_DIRS后面的内部目录include的头文件

                LIBRARIES package_name   #使用功能包package_name的库

               CATKIN_DEPENDS roscpp std_msgs   #其后面指定roscpp和std_msgs依赖包

               DEPENDS system_lib  #描述系统依赖包的设置

               )

add_library()                                #生成库,声明构建之后需要创建的库

add_executable()                        #生成可执行二进制文件

add_dependencies()                   #在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息,则需要先执行

target_link_libraries()                 #在创建特定的可执行文件之前将库和可执行文件进行链接的选项

catkin_add_gtest                        #catkin新加宏,生成测试

install()                                        #安装至本机

例子