429 字
1 分钟
cmake文件配置
一、基础
1.基础语法
1.指定Cmake最低版本
cmake_minimum_required(VERSION 3.10)2.定义项目的名称和使用的编程语言:
project(<project_name> [<language>...])3.指定要生成的可执行文件和其源文件:
add_executable(<target> <source_files>...)4.创建一个库(静态库或动态库)及其源文件:
add_library(<target> <source_files>...)5.链接目标文件与其他库:
target_link_libraries(<target> <libraries>...)6.添加头文件搜索路径:
include_directories(<dirs>...)7.设置变量的值:
set(<variable> <value>...)8.设置目标属性:
target_include_directories(TARGET target_name [BEFORE | AFTER] [SYSTEM] [PUBLIC | PRIVATE | INTERFACE] [items1...])9.安装规则:
install(TARGETS target1 [target2 ...] [RUNTIME DESTINATION dir] [LIBRARY DESTINATION dir] [ARCHIVE DESTINATION dir] [INCLUDES DESTINATION [dir ...]] [PRIVATE_HEADER DESTINATION dir] [PUBLIC_HEADER DESTINATION dir])10.条件语句 (if, elseif, else, endif 命令)
if(expression) # Commandselseif(expression) # Commandselse() # Commandsendif()11.自定义命令 (add_custom_command 命令):
add_custom_command( TARGET target PRE_BUILD | PRE_LINK | POST_BUILD COMMAND command1 [ARGS] [WORKING_DIRECTORY dir] [COMMAND command2 [ARGS]] [DEPENDS [depend1 [depend2 ...]]] [COMMENT comment] [VERBATIM])2.变量缓存
定义变量:
set(MY_VAR "Hello World")使用变量:
message(STATUS "Variable MY_VAR is ${MY_VAR}")定义缓存变量:
set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")使用缓存变量:
message(STATUS "Cache variable MY_CACHE_VAR is ${MY_CACHE_VAR}")3.查找库和包
find_package() 指令
基本用法:
find_package(Boost REQUIRED)指定版本:
find_package(Boost 1.70 REQUIRED)查找库并指定路径:
find_package(OpenCV REQUIRED PATHS /path/to/opencv)使用查找到的库:
target_link_libraries(MyExecutable Boost::Boost)设置包含目录和链接目录:
include_directories(${Boost_INCLUDE_DIRS})link_directories(${Boost_LIBRARY_DIRS})二、ROS2 的 ament 语法
1.基础语法
项目初始化
cmake_minimum_required(VERSION 3.8)project(my_project) # 必须与 package.xml 中的包名一致编译器标准配置
if(NOT CMAKE_C_STANDARD) set(CMAKE_C_STANDARD 99)endif()if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17)endif()
# 编译器警告选项if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic)endif()最终调用
ament_package() # 必须放在 CMakeLists.txt 的最后2.依赖管理语法
查找依赖包
find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(plansys2_executor REQUIRED)为目标添加依赖
ament_target_dependencies(<目标名称> [SYSTEM] [INTERFACE|PUBLIC] <依赖包1> <依赖包2> ...)
#示例:add_executable(my_node src/my_node.cpp)ament_target_dependencies(my_node rclcpp plansys2_executor plansys2_planner)这个宏自动处理三件事:
-
添加依赖项的头文件路径
-
链接依赖项的库
-
处理传递性依赖
注意:官方文档指出,ament_target_dependencies() 现在已被标记为废弃,推荐使用 target_link_libraries() 配合现代 CMake 目标
target_link_libraries(my_node PUBLIC${rclcpp_TARGETS}${plansys2_executor_TARGETS})
3.导出语法
导出目标
ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)导出依赖
ament_export_dependencies(rclcpp plansys2_executor)导出包含目录
ament_export_include_directories(include)导出库
ament_export_libraries(my_library)完整导出示例:
# 安装头文件install(DIRECTORY include/DESTINATION include/${PROJECT_NAME})
# 安装目标并导出install(TARGETS my_libraryEXPORT export_${PROJECT_NAME}LIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION binINCLUDES DESTINATION include)
ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)ament_export_dependencies(rclcpp)4.其他导出语法
导出Cmake接口目标
ament_export_interfaces()导出编译器定义
ament_export_definitions()导出链接器标志
ament_export_link_flags()5.自动化工具语法(ament_cmake_auto)
自动查找依赖
ament_auto_find_build_dependencies() # 自动从 package.xml 查找所有构建依赖ament_auto_find_test_dependencies() # 自动查找测试依赖自动添加目标
ament_auto_add_library(my_library SRCS src/my_library.cpp)ament_auto_add_executable(my_node src/my_node.cpp)自动添加测试
ament_auto_add_gtest(test_my_library test/test_my_library.cpp)ament_auto_add_gmock(test_my_mock test/test_my_mock.cpp)自动打包
ament_auto_package(INSTALL_TO_SHARE config launch)6.完整示例
cmake_minimum_required(VERSION 3.8)project(robot_planer)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic)endif()
# 查找依赖find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(plansys2_executor REQUIRED)find_package(plansys2_planner REQUIRED)find_package(plansys2_msgs REQUIRED)
# 添加可执行文件add_executable(patrol_expert src/patrol_expert.cpp)
# 添加依赖(推荐使用 target_link_libraries)target_link_libraries(patrol_expert PUBLIC ${rclcpp_TARGETS} ${plansys2_executor_TARGETS} ${plansys2_planner_TARGETS})
# 或者使用 ament_target_dependencies(传统方式)ament_target_dependencies(patrol_expert rclcpp plansys2_executor plansys2_planner plansys2_msgs)
# 安装install(TARGETS patrol_expert DESTINATION lib/${PROJECT_NAME})
# 最终调用ament_package() 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
Gradle构建工具(AI整理)
构建工具 Gradle 构建工具笔记,整理项目结构、脚本配置、依赖管理、任务机制和 Android 构建实践。
2
KMP 多平台项目配置(未完待续)
架构 KMP 多平台项目配置笔记,整理 Kotlin Multiplatform 的模块结构、平台配置、依赖和构建流程。
3
Shell语言
命令语言 Shell 学习笔记,整理命令行基础、脚本语法、变量、条件循环、管道和常用工具。
4
工作流引擎学习
工作流 工作流的概念,定义,核心架构和驱动等等
5
UI设计了解(AI生成)
UI设计 UI 设计入门笔记,整理界面概念、常见场景、设计目标、可用性和基础工作流程。