Answers:
Make(或一个Makefile)是一个构建系统-它驱动编译器和其他构建工具来构建代码。
CMake是构建系统的生成器。它可以产生Makefile,可以产生Ninja构建文件,可以产生KDEvelop或Xcode项目,可以产生Visual Studio解决方案。从相同的起点,相同的CMakeLists.txt文件。因此,如果您有一个与平台无关的项目,那么CMake也是使其与系统无关的一种方式。
如果您有习惯于Visual Studio的Windows开发人员和GNU Make誓言的Unix开发人员,那么CMake是(一种或多种)选择。
如果您打算使项目成为多平台或广泛使用的项目,我总是建议使用CMake(或其他构建系统生成器,但CMake是我个人的喜好)。CMake本身还提供了一些不错的功能,例如依赖关系检测,库接口管理或与CTest,CDash和CPack的集成。
使用buildsystem生成器可使您的项目更具前瞻性。即使您现在仅使用GNU-Make,如果以后决定扩展到其他平台(Windows或嵌入式的平台),或者只是想使用IDE怎么办?
find_package()
)或测试/打包支持。
关于CMake是“构建生成器”的说法是一个普遍的误解。
从技术上讲这没有错;它只是描述了它如何工作,而不是它做什么。
在问题的上下文中,它们执行相同的操作:提取一堆C / C ++文件并将其转换为二进制文件。
那么,真正的区别是什么?
CMake更高级。它专为编译C ++而设计,您可以为其编写更少的构建代码,但也可以用于通用构建。make
也有一些内置的C / C ++规则,但是它们几乎没有用。
CMake
做了两个步骤构建:它生成一个低级别的构建脚本ninja
或make
或许多其他发电机,然后运行它。通常堆入的所有Shell脚本片段Makefile
仅在生成阶段执行。因此,CMake
构建可以快几个数量级。
一旦make
构建了工件,它就会忘记它是如何构建的。它的来源是什么,编译器有哪些标志?CMake
跟踪它,make
将它留给您。如果自的早期版本起删除了一个库源Makefile
,make
则不会重建它。
Modern CMake
(从版本3.something开始)根据“目标”之间的依赖关系工作。目标(仍然)仍然是单个otput文件,但可以具有传递(CMake术语为“ public” /“ interface”)依赖性。这些可传递依赖项可以从依赖包中公开或隐藏。CMake
也会为您管理目录。使用make
,您将停留在逐个文件和逐个管理目录的级别。
您可以make
使用标志文件来弥补最后两个空白,从而编写一些代码,但您自己一个人。make
确实包含图灵完整的语言(偶数为两种,有时甚至数为Guile,则为三),而且它们都太可怕了。
说实话,这是什么CMake
,并make
有共同的-他们的语言是相当可怕:
首先。
但是,CMake
您只需编写更少的代码行。