我试图了解 CMake 背后的目的。为什么它的设计就像现在一样。以下是一些我想回答的问题。
- 为什么 cmake 会生成 makefile 而不仅仅是构建项目?
- 为什么 cmake 文件是一系列命令而不仅仅是配置文件 eg:ini/xml/yaml
- 我写入 CMakeLists.txt 的命令应该做什么?我猜只是调用编译器太容易了
- 我应该按什么顺序执行命令?
- 所有内容都不区分大小写吗?可以全部小写吗?
- 为什么教程建议我明确列出每个源文件?
- 如何构建我的 CMakeLists.txt 以使其简短且易于维护。我在实际项目中查找的每个文件看起来都非常困惑。
最佳答案
可能很难理解 CMake 的工作原理。我会尽力简要回答您发布的一些问题。
Why does cmake generate makefiles instead of just building the project?
CMake 是一个 cross-platform make system 并且独立于编译器。它不仅会生成 make 构建系统,还会生成 Visual Studio 解决方案文件。使用相同的 CMakeList.txt 文件,某人可以轻松地创建 Windows 构建 (Visual Studio) 或 Linux 构建 (g++)。
Why are cmake files [a series of] commands and not just configuration files eg: ini/xml/yaml
编译器不使用通用配置,因此 CMake 必须适应目标编译器。
CMake 文件是为目标编译器生成适当配置的一系列命令。
What are the commands that I write into the CMakeLists.txt supposed to do? Just calling the compiler would be too easy I guess
假设它们会为目标编译器生成适当的配置,如果编写正确,它们会生成。
In which order am I supposed to do the commands?
按照重要的顺序,如果顺序很重要的话。是的,这是一个模糊的答案,但这取决于项目。例如 include() 命令将用于添加额外的 cmake 文件,如果您以错误的顺序包含它们,它可能会破坏构建系统的生成。
cmake 文件中的第一个命令必须是最新版本的 CMake (3.0.1) 所需的最低版本。从那里看。 :)
例如,此命令不适用于低于 2.6 的 CMake 版本。
cmake_minimum_required(2.6 版)
请参阅此答案末尾的一些教程链接。
Is everything case insensitive? Can I write everything lower case?
如 CMake wiki 的 language syntax page 所述,所有命令都不区分大小写,但您必须考虑传递给命令的内容的大小写。
Why do tutorials advise me to list every source file explicitly?
因为您必须明确列出每个源文件。这可以在 cmake 文件或 cmake 文件中引用的单独文件列表中完成。有关使用单独文件列表的警告,请参阅 Antonio 的 answer。
CMake 确实提供了一个 command aux_source_directory
,它收集指定目录中所有源文件的名称并将列表存储到变量中,但它只能用于“生成”源文件与 Antonio 的 answer 中提到的相同原因。
How do I structure my CMakeLists.txt to keep it short and simple to maintain. Every file I looked up in real projects looked very cluttered.
很容易弄乱 CMake 文件,解决此问题的一种方法是使用您使用 include 命令引用的 .cmake 文件。
可以在 CMake about page 上找到一个很好的资源(尽管仍在开发中)。
它分为几个部分:
教程
CMake Tutorial - 来自官方 CMake 文档页面
Getting Started With CMake - 使用 CMake 和 gcc 的教程。
Using CMake To Build QT Projects - 使用 CMake 和 QT 的教程。
关于build - 了解 CMake 背后的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751406/