mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
mobile wallpaper 5
mobile wallpaper 6
429 字
1 分钟
cmake文件配置
2025-11-28

一、基础#

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)
# Commands
elseif(expression)
# Commands
else()
# Commands
endif()

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_library
EXPORT export_${PROJECT_NAME}
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES 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()
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

cmake文件配置
https://niushaoxiong.top/posts/cmake/
作者
一只捡星星的熊
发布于
2025-11-28
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录