目标
add_executable
通常,目标包括通过调用or定义的可执行文件或库,add_library
它们可以设置许多属性。
它们可以相互依赖,这对于诸如此类的目标仅意味着依赖的目标将在它们的依赖之后构建。
但是,您也可以通过add_custom_target
. 从文档:
添加具有给定名称的目标以执行给定命令。目标没有输出文件,并且即使命令尝试使用目标名称创建文件,也总是被认为已过期。使用 ADD_CUSTOM_COMMAND 生成具有依赖关系的文件。默认情况下,没有任何东西取决于自定义目标。使用 ADD_DEPENDENCIES 将依赖项添加到其他目标或从其他目标添加依赖项。
因此,这些与“普通”目标不同,因为它们不代表会产生 exe 或 lib 的东西,但它们仍然受益于目标可以拥有的所有属性,包括拥有或成为依赖项。它们显示为可以构建的目标(例如make MyCustomTarget
或msbuild MyCustomTarget.vcxproj
)。构建它们时,您只是调用为它们设置的命令。如果它们依赖于其他目标(普通或自定义),那么将首先构建这些目标。
自定义命令
via 定义的自定义命令add_custom_command
完全不同,因为它不是“可构建”对象,并且不像目标那样具有可设置的属性 - 它不是命名对象,可以在添加后再次显式引用CMakeLists.txt。
它基本上是一个命令(或一组命令),在构建依赖目标之前将被调用。这就是“依赖”在这里的真正含义(至少我是这么看的)——它只是说如果 A 依赖于 B,那么 B 将在 A 构建之前构建/执行。
自定义命令的依赖项可以使用add_custom_command(TARGET target ...
表单显式设置,也可以通过创建包含通过add_custom_command(OUTPUT output1 ...
表单生成的文件的目标来隐式设置。
在第一种情况下,每次target
构建时,都会先执行自定义命令。
在第二种情况下,它有点复杂。如果自定义命令具有依赖于其输出文件的目标(并且输出文件尚不存在),则在构建这些依赖对象之前调用它。当您这样做时,会隐式创建依赖项,add_library(MyLib output1.h ... )
例如output1.h
通过add_custom_command(OUTPUT output1.h ... )
.