CMake中add_custom_command用法详解

add_custom_command 是 CMake 中用于在构建过程中添加自定义命令的工具。它通常用于生成文件或在构建特定目标前后执行操作。其行为和执行时机取决于具体使用场景。


主要用法

add_custom_command 有两种典型用法:

1. 生成文件(Generating Files)

用于生成一个或多个文件,通常与 add_custom_target 或目标依赖结合使用。

cmake 复制代码
add_custom_command(
  OUTPUT output_file         # 生成的输出文件
  COMMAND command [args...]  # 执行的命令
  DEPENDS depend_files...    # 依赖的文件或目标
  COMMENT "message"          # 可选,构建时的提示信息
)
  • 执行时机 :当 output_file 不存在,或其 DEPENDS 中的文件被修改时,命令会自动执行。

  • 示例 :生成源代码文件:

    cmake 复制代码
    add_custom_command(
      OUTPUT generated.cpp
      COMMAND generator_tool input.txt generated.cpp
      DEPENDS input.txt
    )
    add_executable(my_app generated.cpp)  # 依赖 generated.cpp
2. 构建事件(Build Events)

附加到某个目标(如可执行文件或库)的构建阶段,在构建前/后执行命令。

cmake 复制代码
add_custom_command(
  TARGET target             # 目标名称(如可执行文件)
  PRE_BUILD | PRE_LINK | POST_BUILD
  COMMAND command [args...] # 执行的命令
  COMMENT "message"         # 可选,构建时的提示信息
)
  • 执行时机

    • PRE_BUILD:在编译目标源文件之前执行(某些生成器如 Visual Studio 支持)。
    • PRE_LINK:在编译源文件后、链接目标前执行。
    • POST_BUILD:在目标构建完成后执行。
  • 示例 :构建完成后复制文件:

    cmake 复制代码
    add_executable(my_app main.cpp)
    add_custom_command(
      TARGET my_app
      POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:my_app> /path/to/destination/
    )

关键注意事项

  1. 生成文件的依赖链

    如果其他目标依赖 add_custom_command 生成的 OUTPUT 文件(如 generated.cpp),CMake 会自动确保该命令在编译依赖它的目标前执行。

  2. add_custom_target 的区别

    • add_custom_target 定义一个始终执行的虚拟目标(通过 make my_target 手动触发)。
    • add_custom_command 仅在需要生成文件或响应构建事件时触发。
  3. 跨平台兼容性

    使用 ${CMAKE_COMMAND} -E 调用跨平台友好的命令(如文件操作),避免直接使用 cpmv 等系统命令。


总结:执行时机

  • 生成文件模式 :当 OUTPUT 文件不存在,或 DEPENDS 的文件被修改时自动执行。
  • 构建事件模式 :在目标构建的指定阶段(如 POST_BUILD)无条件执行。

合理使用 add_custom_command 可以实现文件生成、后处理、资源嵌入等灵活操作,确保构建流程的自动化。

相关推荐
周之鸥5 天前
Qt 项目国际化从零到一:用 Qt Linguist 实现多语言动态切换(含源码与踩坑指南)
qt·i18n·cmake·qmake·linguist·lupdate·lrelease
老黄编程7 天前
ros2 中 CMakeLists.txt 的 ament_package 有什么用?有什么使用约束?必须放置尾部吗?
ros·cmake
澄澈i8 天前
CMake学习篇[3]---CMake进阶+嵌套CMakeLists+多层级关系
c++·学习·cmake
一只小bit13 天前
CMake 入门实战手册:从理解原理开始,打造高效 C/C++ 开发流程
c语言·开发语言·c++·cmake
研來如此19 天前
Visual Studio 2022
cmake·visual studio
澄澈i23 天前
CMake学习篇[2]---CMake进阶+非同级目录构建+静态库/动态库链接
c++·学习·cmake
usabcd224 天前
如何重新编译HyperLPR原生库以消除16k对齐警告
android·c++·cmake·ndk·mnn·16k对齐·hyperlpr
慧都小项25 天前
Parasoft C/C++test 针对 CMake 项目的自动化测试配置
自动化测试·cmake·parasoft
羑悻的小杀马特1 个月前
CMake 全流程开发实战:从零开始掌握C++项目构建、测试到一键分发的完整解决方案
c++·cmake
UnnamedOrange1 个月前
ROS1 配置代码覆盖率
c++·cmake