You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake add_custom_command函数使用困惑及代码参数疑问

关于CMake add_custom_command 的详细拆解与你的疑惑解答

嘿,我来帮你把这些CMake的疑惑掰明白,先从你的代码和理解入手逐个说清楚~

首先先给你吃个定心丸:你对整体逻辑的理解大方向是对的,咱们来逐个拆解你困惑的点,把每个指令的必要性说清楚:

先确认你前两步的理解(完全正确!)

  • 第1点:add_executable (creator creator.cpp) 确实是用creator.cpp生成名为creator的可执行文件,默认会在当前构建目录(注意不是源码目录,CMake严格区分源码树和构建树)生成。
  • 第2点:get_target_property (creator EXE_LOC LOCATION) 是把creator目标的可执行文件路径存到EXE_LOC变量里,这步没问题,不过现在CMake更推荐用$<TARGET_FILE:creator>这种生成器表达式来获取,写法更规范,但你的写法也能正常工作。

逐个拆解 add_custom_command 里的指令

1. OUTPUT ./created.cpp:为什么必须声明?

CMake是基于依赖的构建系统,它需要明确知道每个构建步骤的输入和输出。你声明OUTPUT的核心作用是告诉CMake:

这个自定义命令会生成./created.cpp这个文件,以后如果有其他目标(比如你的FOO可执行)依赖这个文件,要先执行我这个命令生成它,再去构建依赖目标。

如果不声明OUTPUT,CMake根本不知道这个命令会产出什么,后续的add_executable(FOO ./created.cpp)(哦对了,你代码里写的是created.c,这里后缀写错啦)就无法关联到这个生成步骤,会直接去源码目录找created.cpp,找不到就直接报错。

2. DEPENDS creator:是否必须?不指定会怎样?

必须指定! 这里的DEPENDS是告诉CMake:“要执行这个自定义命令,必须先确保creator这个可执行文件已经被构建完成”。

如果不指定的话,CMake的构建顺序就乱了——它可能会先尝试执行${EXE_LOC}命令,但这时候creator还没编译出来,命令执行失败,自然也生成不了created.cpp,后续的FOO构建也跟着失败。

另外你提到文档里说“若COMMAND指定ADD_EXECUTABLE创建的可执行目标,会自动替换为路径”,那是指你直接写COMMAND creator的情况(CMake会自动把creator替换成它构建出来的可执行文件的绝对路径),但你这里是用${EXE_LOC}变量,所以还是需要明确DEPENDS creator来保证正确的构建顺序。

3. COMMAND ${EXE_LOC}:到底执行什么?

你理解的没错,这就是执行你之前编译出来的creator可执行文件,路径就是存在EXE_LOC里的那个(比如Windows下可能是./Debug/creator.exe,Linux下是./creator)。

刚才提到的文档里的简化写法,如果你把这行改成COMMAND creator,CMake会自动把creator替换成它构建出来的可执行文件的绝对路径,这样你甚至可以删掉get_target_property那一步,写法更简洁。

4. ARGS ./created.cpp:作用是什么?为什么要传这个参数?

ARGS后面跟着的是传递给COMMAND指定的程序的命令行参数。这里的逻辑是:你的creator可执行程序的功能应该就是接收一个文件名作为参数,然后生成对应的cpp文件——比如它的逻辑可能是“我要生成一个叫created.cpp的文件,所以你得告诉它要生成的文件叫什么、放哪里”。

举个例子,你在命令行手动执行的话应该是./creator ./created.cpp,这里的./created.cpp就是给creator的参数,ARGS就是帮你把这个参数传递给COMMAND里的程序。

另外,ARGS其实可以和COMMAND写在同一行,比如COMMAND ${EXE_LOC} ./created.cpp,效果是完全一样的,分开写ARGS只是为了让参数看起来更清晰,尤其是参数很多的时候。


最后给你提个小修正

你最后一行写的是add_executable(FOO ./created.c),但前面的自定义命令生成的是created.cpp,这里后缀写错了,会导致CMake找不到文件,改成./created.cpp就好啦。

内容的提问来源于stack exchange,提问作者Kennedy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:52