# 基础配置部分 ======================================================== cmake_minimum_required(VERSION 3.8) project(tunnel_mapping) # 解决PCL_ROOT策略警告 if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() # 标准与编译选项 ===================================================== set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_EXTENSIONS OFF) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic -fopenmp) # 添加OpenMP支持 endif() # ...(保持基础配置部分不变)... # 核心依赖配置 ======================================================= find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(sensor_msgs REQUIRED) find_package(tf2_ros REQUIRED) find_package(nav_msgs REQUIRED) find_package(Eigen3 REQUIRED) find_package(serial REQUIRED) find_package(OpenMP REQUIRED) find_package(pcl_conversions REQUIRED) find_package(PCL 1.12 REQUIRED COMPONENTS common filters registration io) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};/usr/share/cmake/geographiclib") find_package(GeographicLib REQUIRED) find_package(geographic_msgs REQUIRED) find_package(yesense_interface REQUIRED) # 头文件包含路径 include_directories( include src ${GeographicLib_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} ) # 模块化编译配置 ===================================================== # 定义核心库 add_library(params_manager src/params_manager.cpp include/tunnel_mapping/params_manager.hpp ) target_link_libraries(params_manager rclcpp::rclcpp # 使用命名空间目标 geographic_msgs::geographic_msgs ) ament_target_dependencies(params_manager rclcpp geographic_msgs ) add_library(imu_preintegrator src/imu_preintegrator.cpp include/tunnel_mapping/imu_preintegrator.hpp ) target_link_libraries(imu_preintegrator rclcpp::rclcpp sensor_msgs::sensor_msgs # 显式链接消息类型 geographic_msgs::geographic_msgs ) ament_target_dependencies(imu_preintegrator rclcpp sensor_msgs geographic_msgs )
时间: 2025-06-05 22:37:53 AIGC 浏览: 166
### 解析与使用CMakeLists.txt配置
#### 配置概述
CMake 是一种强大的跨平台构建工具,能够帮助开发者生成适合各种操作系统的构建文件。在 ROS 2 中,`CMakeLists.txt` 文件不仅负责项目的构建逻辑,还承担了依赖项管理和接口定义的任务[^1]。
对于涉及 PCL(Point Cloud Library)、Eigen 等第三方库的项目,正确设置 `CMakeLists.txt` 至关重要。以下是针对这些库的具体解析和使用方法:
---
#### 设置基本结构
一个典型的 `CMakeLists.txt` 文件通常包含以下几个部分:
1. **指定最低版本**
使用 `cmake_minimum_required(VERSION X.X)` 来声明所需的最小 CMake 版本。
```cmake
cmake_minimum_required(VERSION 3.5)
```
2. **项目名称**
定义当前项目的名称。
```cmake
project(my_ros_project)
```
3. **查找必要的包**
利用 `find_package()` 查找并加载所需的功能模块或外部库。例如,在 ROS 2 中需要找到 `ament_cmake` 和其他依赖项。
```cmake
find_package(ament_cmake REQUIRED)
find_package(PCL 1.8 REQUIRED COMPONENTS common io) # 加载PCL及其组件
find_package(Eigen3 REQUIRED) # 加载Eigen库
```
4. **添加可执行文件**
如果项目中有源代码,则可以通过 `add_executable()` 添加目标程序,并链接到对应的库。
```cmake
add_executable(example_node src/example.cpp)
target_link_libraries(example_node PRIVATE PCL::common Eigen3::Eigen)
```
5. **处理消息和服务**
对于自定义的消息和服务文件,需调用 `rosidl_generate_interfaces()` 函数来生成对应的目标文件。
```cmake
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/CustomMessage.msg"
"srv/CustomService.srv"
)
```
6. **安装规则**
明确哪些文件应该被复制到最终部署目录下。
```cmake
install(TARGETS example_node DESTINATION lib/${PROJECT_NAME})
ament_export_dependencies(PCL Eigen3)
```
7. **测试与打包**
声明测试命令以及 AMENT 的元数据导出功能。
```cmake
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
```
以上步骤涵盖了从初始化到完成整个流程的核心要素[^2]。
---
#### 关键点说明
- **PCL 支持**: 要确保系统已正确安装 Point Cloud Library 并能通过 `pkg-config` 或者环境变量定位头文件路径及动态库位置。
- **Eigen 库集成**: Eigen 属于纯模板类库,因此只需确认其头文件可用即可无需额外编译步骤。
- **ROS 接口生成**: 自定义 `.msg` 和 `.srv` 文件必须经过 `rosidl_generate_interfaces` 处理才能供节点间通信使用。
---
#### 示例代码片段
下面提供一段完整的 `CMakeLists.txt` 示例作为参考:
```cmake
cmake_minimum_required(VERSION 3.5)
project(pcl_eigen_example)
# 寻找必要软件包
find_package(ament_cmake REQUIRED)
find_package(PCL 1.8 REQUIRED COMPONENTS common io)
find_package(Eigen3 REQUIRED)
if(NOT TARGET PCL::pcl_common)
message(FATAL_ERROR "Failed to locate the required PCL components.")
endif()
# 创建可执行文件
add_executable(process_point_clouds src/process_pcd.cpp)
target_include_directories(process_point_clouds PUBLIC ${PCL_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR})
target_link_libraries(process_point_clouds PRIVATE PCL::pcl_io PCL::pcl_common Eigen3::Eigen)
# 消息和服务定义 (如果适用)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/PointCloudData.msg"
DEPENDENCIES std_msgs sensor_msgs
)
install(TARGETS process_point_clouds DESTINATION lib/${PROJECT_NAME})
ament_package()
```
上述示例展示了如何将多个复杂依赖组合在一起形成统一的工作流。
---
阅读全文
相关推荐




















