在CMake中,“project”是什么?

58
这个问题涉及到`project`命令,以及在cmake中一个`project`概念是什么意思。我真的不理解`project`是什么,并且它与`target`(我认为我理解了)有什么区别。
我查看了`cmake`文档中关于`project`命令的说明,并发现`project`命令可以:
设置整个项目的名称、版本和启用的语言。
无需额外解释,使用单词`project`来定义`project`显然不太有用。
页面上似乎没有任何地方解释`project`实际上是什么(它列出了一些`command`执行的内容,但没有说明该列表是否是排他的)。 在cmake.org示例中,我们通过一个基本的构建设置,并使用`project`关键字,但也没有解释它的含义或作用,至少我没看出来。
那什么是一个`project`? `project`命令又是做什么的呢?

7
这是CMake文档的困境,欢迎你。自从你提出这个问题以来,情况变得更加糟糕了4年。 - Lothar
CMake试图解决一个混乱的问题,用另一个有组织的混乱来解决。 - smwikipedia
1个回答

47

一个项目会将多个目标(即库、可执行文件和自定义构建步骤)逻辑分组为一个自包含的集合,可以独立构建。

实际上,这意味着,如果在 CMakeLists.txt 文件中有一个 project 命令,你应该能够从该文件运行 CMake,生成可构建的内容。在大多数代码库中,每个构建只有一个单一的项目。

但请注意,您可以嵌套多个项目。顶级项目可以包括子目录,而子目录本身则是另一个自包含的项目。在这种情况下,project 命令引入了某些值的额外作用域。例如,PROJECT_BINARY_DIR 变量将始终指向当前项目的根二进制目录。与此相比,CMAKE_BINARY_DIR 则始终指向顶级项目的二进制目录。同时请注意,某些生成器可能会为项目生成其他文件。例如,Visual Studio 生成器将为每个子项目创建一个 .sln 解决方案文件。

如果您的代码库非常复杂,并且需要用户能够独立构建某些组件,请使用子项目。这为您提供了一种非常强大的构建系统结构机制。由于需要增加编码和维护开销才能使多个子项目真正自包含,我建议只有在真正需要时才采用这种方法。将代码库分成不同的目标应始终是构建结构的首选机制,而子项目应该保留给那些确实需要将一些目标自包含的罕见情况。


你好,ComicsSansMS。如果你在CMakeLists.txt中有一个项目命令,你应该能够从该文件运行CMake,生成可构建的内容。我还看到一些使用“project”命令作为头文件库的项目。这里“project”的作用是什么? - Chen Li
1
@陳力 除了头文件库实际上不构建任何内容之外,它仍然与其他库相同:对project的调用应指示一个自包含的集合,该集合不依赖于源树中更高层次的任何内容。当然,对于头文件库来说,更容易意外地做错这件事,因此可能会发现您特定的头文件库实际上没有这样做,在这种情况下,额外的项目命令将是完全无用的。 - ComicSansMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接