你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 QMake ,微软的 MS NMake,BSD PMake,Makepp等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
CMake就是为解决此问题而诞生的,CMake的全称是Cross platform Make,正如其名,是一种跨平台的Make工具。
CMake首先需要开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 Make更高级的编译配置工具。
参考 CMake 入门实战 | HaHack
CMake于1999年开始开发,是为了解决美国国家医学图书馆出资的Visible Human Project项目下的Insight Segmentation and Registration Toolkit(ITK)软件的跨平台建构的需求而创造出来的。
其设计受到了Ken Martin开发的pcmaker所影响,pcmaker当初则是为了支持Visualization Toolkit(VTK)这个开放源代码的三维图形和视觉系统才出现的,今日VTK也采用了CMake。
CMake于2000年首次发布,并于2001年进一步发展。
参考:https://en.wikipedia.org/wiki/CMake#History
下载64位的MinGW离线安装包,并使用7z进行解压(注意:WinRAR不支持7z格式,),然后MinGW安装目录下的bin目录加入PATH环境变量。(使用在线安装工具可能提示“Cannot download repository.txt”)
https://sourceforge.net/projects/mingw-w64/files/
然后MinGW安装目录下的bin目录加入PATH环境变量
输入g++ --version验证是否安装配置成功
MinGW的bin目录中,make程序名称默认为mingw32-make.exe,为了方便调用后面章节由CMake工具生成的Makefile文件,请复制一份更名make.exe
输入make,验证make是否可用
如果不能出现上述提示,请检查是否将MinGW安装目录下的bin目录加入PATH环境变量。
Download | CMake,双击安装。然后将CMake安装目录下的bin目录加入PATH环境变量。输入cmake --version,验证cmake是否配置OK
在CMake安装目录下的bin目录,是CMake的可执行文件。
可执行程序 |
描述 |
cmake.exe |
用于生成本地构建文件,如Makefile |
cmake-gui.exe |
用于显示用户的配置项以及生成本地构建文件。 |
ctest.exe |
用于对生成的可执行文件进行测试,参见3.4.2 |
pack.exe |
用于制作安装包文件,参见 |
CMake Tutorial | CMake
官方指南,是一个非常的入门材料,它通过Step by step的讲解方式,给出各种CMake的场景样例,对了解CMake的功能全貌很有帮助。
如果看不懂没有关系,也可以以下链接,是对上述官方指南的翻译和解读
GitHub - chaneyzorn/CMake-tutorial: CMake 官方教程----的翻译
cmake使用教程(二)-添加库 - 掘金
实现开根方的功能:tutorial.cpp
// A simple program that computes the square root of a number
#include
#include
#include
int main (int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stdout,"Usage: %s number\n",argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,"The square root of %g is %g\n",
inputValue, outputValue);
return 0;
}
参看下面的CMakeLists.txt文件,最简单的一个工程需要有一个这样的cmake文件,一共三行
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0)
# CMake 设置项目名称
project(Tutorial)
# 指定生成目标
add_executable(Tutorial tutorial.cpp)
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 #
后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。对于上面的 CMakeLists.txt 文件,依次出现了几个命令:
cmake_minimum_required
:指定运行此配置文件所需的 CMake 的最低版本;project
:参数值是 Tutorial,该命令表示项目的名称是 Tutorial 。add_executable
:将名为 tutorial.cpp 的源文件编译成一个名称为 Tutorial 的可执行文件。为了指定makefile生成器类型,以及后续代码编译工具,所以写了一个构建makefile及编译的脚本
:: 删除build文件夹,“/S”表示递归删除,“/Q” 表示静默,可通过在cmd下执行“help rmdir”查看参数具体功能
rmdir /S /Q build
mkdir build
cd build
:: -G后面指定具体的生成器类型,MinGW表示windows,Unix表示unix或linux环境下的生成器。
:: 有关生成器详细参见手册: https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#manual:cmake-generators(7)
:: DCMAKE_C_COMPILER表示C代码的编译工具,DCMAKE_CXX_COMPILER表示C++代码的编译工具;
:: “..”表示到上一级目录寻找"CMakeLists.txt",等同于“../”。
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
:: 在cmake生成了makefile文件,并指定了C/C++源码编译工具后,使用make命令编译makefile定义的工程。
make
pause
整个工程三个文件,结构如下:
编译过程:
编译结果:
运行试验:
在经过前面的CMake入门后,对CMake的功能有一个初步的了解。而要掌握CMake,首先要学编写CMake构建文件(CMakeLists.txt和*.cmake),它是由一些列命令构成,需要掌握一些常用的命令。
VSCode安装CMake插件,支持对CMake构建文件中命令高亮显示,以及输入联想功能,如下图
在经过前面的CMake入门后,对CMake的功能有一个初步的了解。而要掌握CMake,首先要学编写CMake构建文件(CMakeLists.txt和*.cmake),它是由一些列命令构成,需要掌握一些常用的命令。
VSCode安装CMake插件,支持对CMake构建文件中命令高亮显示,以及输入联想功能,如下图
CMake构建文件有三种执行方式
在命令行cmd/shell下,提供cmake命令执行文件
提供一个GUI执行CMake构建文件
VS Code提供了插件,可以调用CMake命令执行CMake构建文件。
点击VS Code视窗底部的按钮
CMake构建文件就是由多条命令组成。包括变量定义、条件块、循环块、宏定义和函数定义,这些定义本身也是命令。
一个源码工程的CMake文件按三种文件方式组织:
l Directories (CMakeLists.txt):源码工程根目录下的CMakeLists.txt代表整个工程构建,通过add_subdirectory添加子目录构建,最终形成整个源码工程对应的构建树。
l Scripts (