当前位置: 首页 > news >正文

CMake中add_custom_command用法详解

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


主要用法

add_custom_command 有两种典型用法:

1. 生成文件(Generating Files)

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

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

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

add_custom_command(
  TARGET target             # 目标名称(如可执行文件)
  PRE_BUILD | PRE_LINK | POST_BUILD
  COMMAND command [args...] # 执行的命令
  COMMENT "message"         # 可选,构建时的提示信息
)
  • 执行时机
    • PRE_BUILD:在编译目标源文件之前执行(某些生成器如 Visual Studio 支持)。
    • PRE_LINK:在编译源文件后、链接目标前执行。
    • POST_BUILD:在目标构建完成后执行。
  • 示例:构建完成后复制文件:
    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 可以实现文件生成、后处理、资源嵌入等灵活操作,确保构建流程的自动化。

相关文章:

  • Kubernetes安装与集群构建详细过程
  • 【STM32标准库】--新建工程
  • redis之缓存击穿
  • JavaScript Symbol与BigInt
  • Vue.js组件安全工程化演进:从防御体系构建到安全性能融合
  • 计算机系统设计中的一些常用方法
  • 《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用MATLAB画一朵会动的3D玫瑰:从零开始的浪漫编程之旅
  • 打造海外流量矩阵,TikTok云控工具让获客更简单!
  • SpringBoot企业级开发之【用户模块-更新用户头像】
  • 1、从零搭建魔法工坊:React 19 新手村生存指南
  • ai软件UI自动化
  • 解锁语言学习新宝藏:Forvo 网站深度探秘​
  • 【Zabbix7.2修改网页logo和系统名称的方法】
  • 软件信息化项目等级分类评定表
  • Amazon Bedrock Agents:企业 AI 应用开发的革新力量
  • AI数字人如何实时调整互动方式?
  • 【赵渝强老师】TiDB的行存引擎:TiKV
  • 03-libVLC的视频播放器:控制(播放/暂停/停止/拖动条/声音)
  • HackTheBox提速指南:利用VPS与SSH SOCKS代理优化网络体验
  • uniapp中,使用plus.io实现安卓端写入文件
  • 做网站的图片/seo实战培训教程
  • 网线制作颜色顺序/短视频seo询盘系统
  • 商业网站推广/百度收录入口在哪里查询
  • 行业网站产品选择/产品软文是什么
  • 网站中文名称注册/百度下载安装免费
  • 网站建设需要提供什么东西/百度快速收录接口