了解CMake背后的目的

时间:2014-09-09 18:28:31

标签: build cmake

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

  • 为什么cmake会生成makefile而不仅仅是构建项目?
  • 为什么cmake文件是一系列命令,而不仅仅是配置文件,例如:ini / xml / yaml
  • 我写入CMakeLists.txt的命令是什么?只是调用编译器太容易了我猜
  • 我应该按照哪个顺序执行命令?
  • 一切都不敏感吗?我能写下小写吗?
  • 为什么教程建议我明确列出每个源文件?
  • 如何构建我的CMakeLists.txt以使其简短易维护。我在实际项目中查找的每个文件看起来都非常混乱。

2 个答案:

答案 0 :(得分:12)

很难理解CMake的工作原理。我会尽力简要回答您发布的一些问题。

  

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

CMake是cross-platform make system并且与编译器无关。它不仅生成make build系统,还生成Visual Studio解决方案文件。使用相同的CMakeList.txt文件,可以轻松创建Windows构建(Visual Studio)或Linux构建(g ++)。

  

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

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

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

  

我写入CMakeLists.txt的命令是什么?只是调用编译器太容易我猜

他们假设为目标编译器生成适当的配置,如果写得正确,它们将会被生成。

  

我应该按照哪个顺序执行命令?

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

cmake文件中的第一个命令必须是最新版本的CMake(3.0.1)所需的最低版本。从那里它取决于。 :)

例如,此命令不适用于小于2.6的CMake版本。 cmake_minimum_required (VERSION 2.6)

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

  

一切都不敏感吗?我能写下小写吗?

正如CMake wiki' language syntax page所述,所有命令都不区分大小写,但您必须考虑传递给命令的内容的大小写。

  

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

因为您必须明确列出每个源文件。这可以在cmake文件内部或cmake文件中引用的单独文件列表中完成。有关使用单独文件列表的警告,请参阅Antonio answer

CMake确实提供了一个command aux_source_directory,它收集指定目录中所有源文件的名称,并将列表存储到变量中,但它只能用于"生成& #34;源文件的原因与安东尼奥answer中提到的相同。

  

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

很容易使CMake文件混乱,一种方法是使用include命令引用您使用的.cmake文件。

可以在CMake about page上找到一个好资源(虽然仍在开发中)。

它分为几个部分:

  1. Overview
  2. 统计(正在制定中)
  3. Participants
  4. Documentation
  5. License
  6. Success Stories
  7. Publications
  8. News
  9. <强>教程

    CMake Tutorial - 来自官方CMake文档页面

    Getting Started With CMake - 使用CMake和gcc的教程。

    Using CMake To Build QT Projects - 使用CMake和QT的教程。

答案 1 :(得分:3)

由于jmstoker已经给出了一个非常完整的答案,我将专注于这一点:

"Why do tutorials advise me to list every source file explicitly?"

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

使用git有一个解决方案,允许触发“cmake”。每次合并发生。 Getting cmake to run before building after pulling from git

相关问题