gpt4 book ai didi

cmake - 为什么 CMake 区分 "target"和 "command"?

转载 作者:行者123 更新时间:2023-12-02 13:29:41 26 4
gpt4 key购买 nike

在 CMake 语义中,“目标”和“命令”之间存在某种区别,这让我感到困惑。在 Makefile 中,没有这样的区别:

targetname:dependency
command

即目标对应于生成的同名文件。

在 CMake 中,您拥有诸如“add_custom_command”和“add_custom_target”之类的命令,这些命令具有重叠的功能,甚至在官方文档中,语义也很困惑,即在“掌握 CMake,第 5 版”,第 110 页“添加自定义目标”下“:

The DEPENDS argument sets up a dependency between the custom target and the custom commands.

我的理解是目标(生成的文件)具有依赖项(其他文件,无论是否生成),以及实际进行生成的命令。说目标取决于命令是毫无意义的。更糟糕的是,有两种类型的“add_custom_command”,要么将附加命令附加到现有目标,要么将命令吐出到以太中。

有人可以解释一下为什么存在这种区别吗?

最佳答案

目标

一般来说,目标包含通过调用 add_executable 定义的可执行文件或库。或 add_library 其中可以有很多properties设置。

它们可以相互依赖,对于诸如此类的目标来说,这仅意味着依赖项将在其依赖项之后构建。

但是,您也可以通过 add_custom_target 定义“自定义目标” 。来自文档:

Adds a target with the given name that executes the given commands. The target has no output file and is ALWAYS CONSIDERED OUT OF DATE even if the commands try to create a file with the name of the target. Use ADD_CUSTOM_COMMAND to generate a file with dependencies. By default nothing depends on the custom target. Use ADD_DEPENDENCIES to add dependencies to or from other targets.

因此,这些目标与“普通”目标不同,因为它们不代表将生成 exe 或 lib 的事物,但它们仍然受益于目标可以具有的所有属性,包括具有或存在依赖项。它们显示为可以构建的目标(例如 make MyCustomTargetmsbuild MyCustomTarget.vcxproj )。当您构建它们时,您只需调用为它们设置的命令即可。如果它们依赖于其他目标(正常或自定义),那么将首先构建这些目标。


自定义命令

通过 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 ... ) 生成的文件.

关于cmake - 为什么 CMake 区分 "target"和 "command"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com