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、qmakewww.cnblogs.com![c9f1892d228a8ae767124caff1b922e5.png](https://i-blog.csdnimg.cn/blog_migrate/02d643f5121297a967bae12c73b887c9.jpeg)
ROS 的编译器便是 CMake,为了更加人性化,ROS 在 CMake 基础上封装了 catkin 命令,用 cmake 命令创建功能包时,会自动生成 CMakeList.txt 文件,已配置了多数编译选项,且包含详细的注释,只需稍作修改便可编译自己的文件。
而 package.xml 文件是描述功能包清单的文件,包括功能包的名称、版本号、作者信息、许可信息、编译依赖和运行依赖等。
我们在用 catkin_create_pkg 命令创建功能包时,是会自动生成 CMakeLists.txt 和 package.xml 文件的。
举例:
# 创建工作空间
mkdir -p ~/catkin_ws/src
![eb6ea35ed9203e4209757b40590a3c56.png](https://i-blog.csdnimg.cn/blog_migrate/ceec72560e5b9a6b2cef52767c8566aa.png)
![7109fa02acac47c13b02c8f7123357c4.png](https://i-blog.csdnimg.cn/blog_migrate/94037fd6579d566c9fcf7849075488bd.png)
下面看下 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"?>