CMake是可跨平台的构建和编译大型项目的工具,CMake不是一套编译工具,它里面并不包含编译器,它能做的只是减轻我们输入繁琐命令的负担。另外,如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用 Make 工具,就得为每一种标准写一次 Makefile,那这就太痛苦了。。。
CMake并不直接构建出最终的软件,而是产生标准的构建文档(比如Unix下的makefile,Mac下的xcode,windows下的MSVS工程文件)。CMake首先允许开发者编写一种与平台无关的CMakeLists.txt文件来制定整个编译流程,然后根据目标用户的平台来生成所需要的本地化Makefile、工程文件。
在Linux下,CMake就是用来生成Makefile的,而Makefile包含了一些列的编译和链接规则,它告诉make命令需要怎么样的去编译和链接程序。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 编写 CMake 配置文件 CMakeLists.txt (CMakeLists.txt 规定了整个编译的流程,我们学习的CMake 也就是要学习CMakeLists.txt的编写规则)。
- 执行命令
cmake PATH
生成 Makefile,其中,PATH
是 CMakeLists.txt 所在的目录。 - 使用
make
命令进行编译。
CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档(详见:一步一步学Cmake之 构建 单目录或多目录 C++工程)。CMake 也支持静态与动态库的建构(详见:一步一步学CMake 之 构建和链接库文件)。
CMake构建工程中所涉及的几个概念:
配置阶段(Configure time or CMake time)是指CMake正在处理CMakeLists.txt的阶段;
生成阶段(Generation time)是指 原生构建工具(native build tool),比如:Makefiles,生成过的阶段;
构建阶段(Build time)是指 基于生成的原生构建工具,比如:Makefiles,编译器开始编译,并生成目标文件(可执行文件或库文件)的过程。