在ROS 2中,CMakeList.txt 文件扮演着配置和管理构建过程的重要角色。这个文件遵循CMake的语法,用于定义如何编译和链接源代码。下面是一些在ROS 2项目CMakeList.txt文件中常见的语法和用法。
1. 基本结构和命令
cmake_minimum_required(VERSION ):指定CMake的最低版本要求。
project():定义项目的名称,这个名称会用于构建过程中生成的目录和变量。
2. 查找和包含ROS 2的CMake宏
find_package(ament_cmake REQUIRED COMPONENTS …):查找ament_cmake包,这是ROS 2中用于包管理的CMake工具集。COMPONENTS后列出你需要的ament_cmake组件,比如dependencies、tests等。
find_package(rclcpp REQUIRED):查找并包含rclcpp包,rclcpp是ROS 2的C++客户端库。REQUIRED表明这个包是必需的,如果找不到则CMake会报错。
3. 添加源文件
set(CMAKE_CXX_STANDARD 14)(或更高版本):设置C++标准。
add_executable( …):添加一个可执行文件目标。是构建后生成的可执行文件的名称, …是构成该可执行文件的源文件列表。
add_library( SHARED|STATIC …):添加一个库目标。可以是共享库(SHARED)或静态库(STATIC)。
4. 链接库
target_link_libraries( <PRIVATE|INTERFACE|PUBLIC> …):为指定的目标(可执行文件或库)链接库。PRIVATE、INTERFACE、PUBLIC指定了链接属性的可见性。
5. 设置编译选项和依赖
ament_target_dependencies( …):为ament管理的目标(如ROS 2包)添加依赖。这确保了这些依赖在构建你的包之前被构建。
if(DEFINED ENV{}) 和 else()、endif():条件语句,可以根据环境变量或CMake变量的值来决定是否执行某些操作。
6. 安装目标和文件
install(TARGETS DESTINATION
install(FILES … DESTINATION
7. ROS 2特有的CMake宏
ROS 2还提供了一些特有的CMake宏,如:
ament_package():标记这个CMakeLists.txt定义的是一个ament包,用于ROS 2的包管理。
rosidl_generate_interfaces(…):自动生成ROS 2消息、服务和动作的接口代码。ament_auto_add_library
是 ROS 2 中 ament_cmake_auto
包提供的一个宏,用于简化 CMakeLists.txt 文件中添加库的过程。这个宏结合了多个 CMake 命令的功能,使得添加库变得更加简单和直观。以下是 ament_auto_add_library
的基本用法:
8 ament_auto_add_library 基本语法
ament_auto_add_library(<library_name> [SHARED|STATIC|MODULE|INTERFACE|OBJECT] <source_files> ...)
<library_name>
:你想要创建的库的目标名称。[SHARED|STATIC|MODULE|INTERFACE|OBJECT]
:指定库的类型。如果不指定,默认为SHARED
(共享库)。<source_files> ...
:构成库的源文件列表。
使用示例
假设你有一个 ROS 2 包,其中包含了一些 C++ 源文件,你想要将它们编译成一个共享库。你的 CMakeLists.txt 文件可能看起来像这样:
cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)
# 查找并包含ament_cmake_auto包
find_package(ament_cmake_auto REQUIRED)
# 自动查找构建依赖
ament_auto_find_build_dependencies()
# 添加库
ament_auto_add_library(my_library SHARED
src/my_library.cpp
include/my_library/my_library.hpp
)
# 打包ament包
ament_auto_package()
在这个例子中,ament_auto_add_library
宏被用来创建一个名为 my_library
的共享库,它包含了 src/my_library.cpp
源文件和 include/my_library/my_library.hpp
头文件。ament_auto_find_build_dependencies()
宏用于自动查找并包含构建这个库所需的依赖项。最后,ament_auto_package()
宏用于打包这个 ament 包,以便它可以被 ROS 2 的包管理系统识别和使用。
优点
- 简化 CMakeLists.txt:
ament_auto_add_library
宏减少了需要编写的 CMake 命令数量,使得 CMakeLists.txt 文件更加简洁易读。 - 自动处理依赖:通过
ament_auto_find_build_dependencies()
宏,ament_auto_add_library
能够自动查找并包含构建库所需的依赖项,减少了手动查找和包含依赖的麻烦。 - 提高构建效率:由于
ament_cmake_auto
提供了许多自动化功能,因此它可以提高 ROS 2 包的构建效率。
注意事项
- 确保你的 ROS 2 环境已经安装了
ament_cmake_auto
包。 - 在使用
ament_auto_add_library
之前,需要调用find_package(ament_cmake_auto REQUIRED)
来查找并包含这个包。 - 如果你的库依赖于其他 ROS 2 包或第三方库,请确保在调用
ament_auto_add_library
之前使用find_package()
命令来查找这些依赖项。然而,对于 ROS 2 包内的依赖项,ament_auto_find_build_dependencies()
宏通常能够自动处理。
9 rclcpp_components_register_node的用法
rclcpp_components_register_node
是 ROS 2 中用于注册组件式节点的一个宏,它允许你将一个类作为组件注册到 ROS 2 的组件容器中。这样,你就可以在运行时动态地加载、卸载和重新配置这些组件,而无需重新编译整个系统。这对于构建模块化、可扩展的 ROS 2 应用程序非常有用。
然而,需要注意的是,rclcpp_components_register_node
宏本身并不是 ROS 2 API 的一部分,或者至少不是以这种方式直接使用的。实际上,你可能是在寻找如何使用 rclcpp::Node
派生类与 ROS 2 组件系统结合的方法。
在 ROS 2 中,注册组件通常涉及以下几个步骤:
-
定义组件类:首先,你需要定义一个从
rclcpp::Node
派生的类,并在这个类中实现你的逻辑。但是,对于组件,你通常会从rclcpp_components::NodeComponent
或rclcpp_lifecycle::LifecycleNode
(如果你还需要生命周期管理)派生。 -
注册组件:然后,你需要使用
rclcpp_components
提供的宏(如RCLCPP_COMPONENTS_REGISTER_NODE
)来注册你的组件。这个宏会在编译时生成必要的代码,以便 ROS 2 的组件容器能够识别并加载你的组件。 -
在组件容器中加载组件:最后,你可以使用 ROS 2 的组件客户端(如
rclcpp_components::ComponentClient
)来在运行时加载你的组件。
示例
下面是一个简化的示例,展示了如何定义一个组件并注册它:
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_components/register_node_macro.hpp"
// 假设我们有一个简单的组件类
class MyComponent : public rclcpp::NodeComponent {
public:
explicit MyComponent(rclcpp::Node::SharedPtr node)
: NodeComponent(node) {
// 初始化代码
RCLCPP_INFO(this->get_logger(), "MyComponent initialized");
}
// 组件的其他成员函数...
};
// 使用 RCLCPP_COMPONENTS_REGISTER_NODE 宏注册组件
// 注意:这里的宏参数需要根据你的包名和组件类名进行调整
RCLCPP_COMPONENTS_REGISTER_NODE(my_package::MyComponent)
// 注意:上面的宏调用实际上是在内部生成了一些代码,
// 这些代码会在编译时添加到你的库中,以便 ROS 2 的组件系统能够识别它。
// 你不需要(也不应该)在你的代码中直接调用这个宏生成的任何函数或类。
注意:RCLCPP_COMPONENTS_REGISTER_NODE
宏的确切用法可能会根据你的 ROS 2 版本和配置有所不同。上面的示例是一个简化的表示,旨在说明概念。在实际应用中,你可能需要查阅 ROS 2 的官方文档或源代码来获取准确的宏用法和参数。
此外,如果你的组件需要生命周期管理,你可能需要从 rclcpp_lifecycle::LifecycleNode
派生,并使用 rclcpp_lifecycle::register_node_macro
宏进行注册。但是,这通常涉及到更复杂的设置,包括定义生命周期状态和转换。
10 ament_auto_package 用法
ament_auto_package
是 ROS 2 中 ament_cmake_auto
包提供的一个宏,用于简化 CMakeLists.txt 文件中与包打包相关的操作。这个宏封装了多个 CMake 命令,以便在 ROS 2 包的构建过程中自动执行必要的打包步骤。
基本用法
在 CMakeLists.txt 文件的末尾调用 ament_auto_package()
宏,通常是在添加了所有可执行文件、库和测试之后。这个宏会处理与包打包相关的各种任务,如生成必要的配置文件、安装头文件和库文件等。
示例
以下是一个使用 ament_auto_package
宏的 CMakeLists.txt 文件的示例片段:
cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)
# 查找并包含ament_cmake_auto包
find_package(ament_cmake_auto REQUIRED)
# 自动查找构建依赖
ament_auto_find_build_dependencies()
# 添加可执行文件或库
# ...(省略了添加可执行文件或库的代码)
# 打包ament包
ament_auto_package()
功能概述
ament_auto_package
宏执行以下主要功能:
-
生成必要的配置文件:为 ROS 2 包生成必要的配置文件,如
setup.py
、setup.bash
等,这些文件用于在 ROS 2 环境中设置包的路径和依赖项。 -
安装头文件和库文件:将包中的头文件和库文件安装到 ROS 2 的安装目录中,以便其他包可以在编译时找到它们。
-
处理依赖项:虽然
ament_auto_find_build_dependencies()
宏用于在编译时查找依赖项,但ament_auto_package
宏也可能涉及与依赖项相关的打包任务,如生成依赖项列表等。 -
生成元数据:为 ROS 2 包生成元数据,如版本信息、作者信息等,这些信息对于包的分发和使用非常重要。
注意事项
- 确保在调用
ament_auto_package()
宏之前已经添加了所有必要的可执行文件、库和测试。 - 如果你的包包含自定义的 CMake 宏或函数,并且这些宏或函数需要在打包过程中执行特定任务,请确保它们在
ament_auto_package()
宏之前被定义和调用。 ament_cmake_auto
包是 ROS 2 的一部分,因此在使用它之前,请确保你的 ROS 2 环境已经正确安装并配置了所有必要的依赖项。
总之,ament_auto_package
宏是 ROS 2 中用于简化包打包过程的一个非常有用的工具。通过自动执行与打包相关的各种任务,它可以帮助开发者节省时间和精力,并减少因手动配置错误而导致的问题。
11 ament_auto_find_build_dependencies()的用法
ament_auto_find_build_dependencies()
是 ROS 2 中 ament_cmake
包提供的一个宏,用于在 CMakeLists.txt 文件中自动查找并包含构建依赖项。这个宏简化了依赖项查找的过程,使得开发者不需要手动为每个依赖项调用 find_package()
。
基本用法
在 CMakeLists.txt 文件中,ament_auto_find_build_dependencies()
宏通常位于文件的顶部或靠近顶部的位置,以便在添加任何库、可执行文件或测试之前找到并包含所有必要的依赖项。
示例
以下是一个使用 ament_auto_find_build_dependencies()
宏的 CMakeLists.txt 文件的示例片段:
cmake_minimum_required(VERSION 3.5)
project(my_ros2_package)
# 查找并包含ament_cmake包
find_package(ament_cmake REQUIRED)
# 自动查找构建依赖
ament_auto_find_build_dependencies()
# 添加库或可执行文件
# ...(省略了添加库或可执行文件的代码)
# 打包ament包
ament_package()
# 注意:在ROS 2 Foxy及更高版本中,建议使用 ament_auto_package() 替代 ament_package(),
# 但这里的重点是展示 ament_auto_find_build_dependencies() 的用法。
注意:在 ROS 2 Foxy 及更高版本中,推荐使用 ament_auto_package()
而不是 ament_package()
来打包你的包,因为 ament_auto_package()
提供了更多的自动化和简化。但是,ament_auto_find_build_dependencies()
的用法在所有支持 ROS 2 的版本中都是相似的。
功能概述
ament_auto_find_build_dependencies()
宏执行以下主要功能:
-
查找构建依赖项:它会自动查找并包含你的包在构建过程中所需的所有依赖项。这通常是通过读取
package.xml
文件中列出的依赖项来完成的,因为 ROS 2 使用package.xml
文件来管理包的依赖关系。 -
包含依赖项:对于找到的每个依赖项,它会调用
find_package()
(或等效的 CMake 命令)来包含该依赖项。这确保了你的包在编译时能够找到并使用这些依赖项提供的库、头文件等。
注意事项
- 确保你的
package.xml
文件已经正确列出了所有必要的构建依赖项。 - 如果你的包依赖于特定的 CMake 版本或具有特殊要求的依赖项,则可能需要手动调用
find_package()
来确保这些依赖项被正确包含。 - 在某些情况下,你可能需要为特定的依赖项设置 CMake 变量或目标属性。这通常需要在
ament_auto_find_build_dependencies()
宏之后手动完成。
总之,ament_auto_find_build_dependencies()
宏是 ROS 2 中用于自动查找并包含构建依赖项的一个非常有用的工具。通过简化依赖项查找的过程,它可以帮助开发者节省时间和精力,并减少因手动配置错误而导致的问题。
通过上述介绍的语法和命令,你可以定义项目的构建目标、添加源文件、链接库、设置编译选项
和依赖,以及安装目标和文件。这些功能使得CMake成为ROS 2中不可或缺的构建系统。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » ROS 2中,CMakeList.txt常见语法
发表评论 取消回复