Build 理解CMake背后的目的

Build 理解CMake背后的目的,build,cmake,Build,Cmake,我试图理解CMake背后的目的。为什么它被设计成现在这样。以下是一些我想回答的问题 为什么cmake生成makefiles而不仅仅是构建项目 为什么cmake文件是一系列命令,而不仅仅是配置文件,例如:ini/xml/yaml 我写进CMakeLists.txt的命令应该做什么?我想仅仅调用编译器就太容易了 我应该按什么顺序执行命令 所有内容都不区分大小写吗?我能把所有东西都写成小写吗 为什么教程建议我明确列出每个源文件 如何构造CMakeLists.txt,使其保持简短且易于维护。我在实际项

我试图理解CMake背后的目的。为什么它被设计成现在这样。以下是一些我想回答的问题

  • 为什么cmake生成makefiles而不仅仅是构建项目
  • 为什么cmake文件是一系列命令,而不仅仅是配置文件,例如:ini/xml/yaml
  • 我写进CMakeLists.txt的命令应该做什么?我想仅仅调用编译器就太容易了
  • 我应该按什么顺序执行命令
  • 所有内容都不区分大小写吗?我能把所有东西都写成小写吗
  • 为什么教程建议我明确列出每个源文件
  • 如何构造CMakeLists.txt,使其保持简短且易于维护。我在实际项目中查找的每个文件看起来都非常混乱

    • 很难理解CMake是如何工作的。我将尽我所能简要回答您发布的一些问题

      为什么cmake生成makefiles而不仅仅是构建项目

      CMake是一个独立于编译器的应用程序。它不仅生成生成生成系统,还生成VisualStudio解决方案文件。使用相同的CMakeList.txt文件,用户可以轻松创建windows版本(Visual Studio)或Linux版本(g++)

      为什么cmakefiles[一系列]命令,而不仅仅是配置文件,例如:ini/xml/yaml

      编译器不使用通用配置,因此CMake必须适应目标编译器

      CMake文件是为目标编译器生成适当配置的一系列命令

      我写进CMakeLists.txt的命令应该做什么?我想仅仅调用编译器就太容易了

      假设它们为目标编译器生成适当的配置,如果编写正确,它们将生成相应的配置

      我应该按什么顺序执行命令

      在重要的顺序中,如果顺序很重要的话。是的,这是一个模糊的答案,但这取决于项目。例如,include()命令将用于添加其他cmake文件,如果您以错误的顺序包含它们,则可能会中断生成系统

      cmake文件中的第一个命令必须是cmake最新版本(3.0.1)所需的最低版本。这要看情况而定

      例如,此命令不适用于低于2.6的CMake版本。
      cmake\u最低要求(2.6版)

      请参阅本答案末尾的一些教程链接

      所有内容都不区分大小写吗?我能把所有东西都写成小写吗

      如CWEW Wiki所言,所有的命令都不区分大小写,但是必须考虑到传递给命令的内容的情况。 为什么教程建议我明确列出每个源文件

      因为您必须明确列出每个源文件。这可以在cmake文件或cmake文件中引用的单独文件列表中完成。关于使用单独文件列表的注意事项,请参见Antonio's

      CMake确实提供了一个
      aux_source_目录
      ,该目录收集指定目录中所有源文件的名称,并将列表存储到一个变量中,但它只应用于“生成的”源文件,原因与Antonio的中提到的相同

      如何构造CMakeLists.txt,使其保持简短且易于维护。我在实际项目中查找的每个文件看起来都非常混乱

      很容易将CMake文件弄得乱七八糟,一种帮助实现这一点的方法是使用使用include命令引用的.CMake文件

      一个很好的资源(尽管仍在开发中)可以在网站上找到

      它分为几个部分:

    • 统计(发展中)
    • 教程

      -从官方CMake文档页面

      -将CMake与gcc结合使用的教程


      -一个将CMake与QT结合使用的教程。

      既然jmstoker已经给出了一个非常完整的答案,我将重点关注这一点:

      “为什么教程建议我明确列出每个源文件?”

      实际上,您可以使用globbing函数,但是问题是,如果您添加了一个文件,那么您必须显式运行cmake,使cmake知道它的存在。如果您“独自”工作,这通常不是问题,但在共享项目中,如果有人添加文件,您进行更新,然后您面对奇怪的错误进行编译,这可能是问题

      有了git,就有了一个解决方案,每次合并时都可以触发“cmake”。

      非常感谢您提供的信息。但这还不清楚:我的文件需要生成什么样的适当配置?我知道这是“取决于你想要什么”。但我总是困惑于在这里帮助自己。您在此处链接的文档是一个参考资料,这正是我不想要的,因为它假定我已经理解了一般用途。@Arne,如果您想对某个特定问题给出具体答案,我建议您创建一个包含这些详细信息的新问题。如果没有这些细节,很难说得具体。我想我的问题在要求好的深度教程时是具体的。这些问题只是一些例子,不是我所有的问题。从写20道堆栈溢出问题开始学习CMake是不对的。所以我想我会错过一些大家都知道的东西,除了我需要阅读的东西。@Arne你的推理是正确的,你的问题也是正确的,但是专门要求一个教程是离题的。我重新编写了你的问题,因为我认为你提出了很好的问题,我不希望它被标记为接近投票。我能理解学习CMake的挫折感,这促使我提供这个答案。帮助我理解你在哪里迷失了方向。