add_custom_command不执行解决

set(INPUT_FILE
    ${CMAKE_CURRENT_LIST_DIR}/config.json)
set(OUTPUT_FILE
    ${CMAKE_CURRENT_LIST_DIR}/config_test.h)

add_custom_command(
  OUTPUT "${OUTPUT_FILE}"
 .........
 .........
)

路径正确,但是add_custom_command就是不执行

  • 加上add_executable(main main.cc ${OUTPUT_FILE})
  • 执行make -j8 main,必须是生成main的时候才会执行add_custom_command中的内容

原因:生成的可执行文件必须依赖OUTPUT 那里设置的输出文件。。。

### `add_custom_command` 的基本用法 `add_custom_command` 是 CMake 中用于定义自定义构建步骤的关键命令,通常用于在构建过程中执行特定的生成任务,例如生成源代码文件、处理资源文件或运行脚本。该命令支持两种主要使用形式:一种是为输出文件定义生成规则,另一种是为某个目标添加构建前或构建后的操作。 以下是一个典型的使用示例: ```cmake add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable ) ``` 上述代码中,`OUTPUT` 指定了生成的目标文件 `Table.h`,`COMMAND` 定义了生成该文件的命令,而 `DEPENDS` 则指定了该命令依赖的输入文件(或目标)。只有在依赖项发生变化时,CMake 才会重新执行该命令。这种机制非常适合用于自动生成代码文件,例如从配置文件或数据表中生成 C++ 头文件[^4]。 ### `add_custom_command` 与 `add_library` 的结合使用 在实际项目中,`add_custom_command` 通常与 `add_library` 或 `add_executable` 结合使用,以确保生成的文件可以被正确编译进目标中。例如,在构建数学库 `MathFunctions` 时,`Table.h` 是通过 `MakeTable` 可执行文件生成的,并被包含在库的源文件列表中: ```cmake add_executable(MakeTable MakeTable.cxx) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h) ``` 在此示例中,`MakeTable` 是一个可执行程序,用于生成 `Table.h` 文件。`add_custom_command` 确保该文件在构建过程中被正确生成,而 `include_directories` 则将生成文件的目录加入头文件搜索路径。最终,`Table.h` 被包含在 `MathFunctions` 库的源文件中,确保其在编译阶段可用[^4]。 ### `add_custom_command` 与 `add_custom_target` 的区别 `add_custom_command` 通常用于定义某个文件的生成方式,而 `add_custom_target` 则用于定义一个独立的构建目标。`add_custom_target` 常用于执行直接生成文件的操作,例如打包、部署或运行测试脚本。 以下是一个使用 `add_custom_target` 的示例: ```cmake add_custom_target(Setup ALL COMMAND MakeNSIS.exe /V1 MyScript.nsi WORKING_DIRECTORY ${nsis_dir} COMMENT "begin Setup building..." ) ``` 在此示例中,`add_custom_target` 定义了一个名为 `Setup` 的构建目标,它会执行 `MakeNSIS.exe` 命令来构建安装程序。`WORKING_DIRECTORY` 指定命令执行的目录,而 `COMMENT` 则提供构建时的提示信息。与 `add_custom_command` 同,`add_custom_target` 依赖于特定的输出文件,而是作为一个独立的构建步骤存在[^2]。 ### `add_custom_command` 的高级用法 除了基本的文件生成,`add_custom_command` 还可以与其他构建系统特性结合使用,例如条件判断、多命令执行和文件监控。例如,可以通过 `VERBATIM` 参数确保命令中的空格和特殊字符被正确处理,或者通过 `APPEND` 参数向已有目标添加额外的构建步骤。 此外,`add_custom_command` 支持多个输出文件的定义,适用于同时生成多个文件的场景: ```cmake add_custom_command( OUTPUT file1.txt file2.txt COMMAND generate_files.sh DEPENDS input.data ) ``` 此示例中,`generate_files.sh` 脚本会在 `input.data` 文件发生变化时执行,并生成 `file1.txt` 和 `file2.txt` 两个输出文件。CMake 会根据输出文件的修改时间决定是否重新执行该命令。 ### 总结 `add_custom_command` 是 CMake 中用于定义自定义构建逻辑的核心工具之一,适用于生成源代码、处理资源文件、执行预处理任务等场景。通过与 `add_executable`、`add_library` 和 `add_custom_target` 等命令结合使用,可以实现灵活的自动化构建流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值