CMake是一个开源、跨平台的编译、测试和打包工具,它使用比较简单的语言描述编译、安装的过程,输出Makefile或者project文件,再去执行构建。
在使用IDE开发软件的过程中,代码的编译和构建一般是使用IDE自带的编译工具和环境进行编译,开发者参与的并不算多。如果想要控制构建的细节,则需要开发者自己定义构建的过程。
本文主要介绍以下内容:
-
编译构建相关的核心概念及它们之间的关系
-
CMake的一般使用流程
-
一个简单的实例
一 核心概念
1 gcc、make和cmake
gcc(GNU Compiler Collection)将源文件编译(Compile)成可执行文件或者库文件;
而当需要编译的东西很多时,需要说明先编译什么,后编译什么,这个过程称为构建(Build)。常用的工具是make,对应的定义构建过程的文件为Makefile;
而编写MakeFile对于大型项目又比较复杂,通过CMake就可以使用更加简洁的语法定义构建的流程,CMake定义构建过程的文件为CMakeLists.txt。
它们的大致关系如下图:
这里的GCC只是示例,也可以是其他的编译工具。这里的Bin表示目标文件,可以是可执行文件或者库文件。
二 CMake一般使用流程
CMake提供cmake、ctest和cpack三个命令行工具分别负责构建、测试和打包。本文主要介绍cmake命令。
使用cmake一般流程为:
-
生成构建系统(buildsystem,比如make工具对应的Makefile);
-
执行构建(比如make),生成目标文件;
-
执行测试、安装或打包。
本文先介绍前面两个步骤。
1 生成构建系统
通过cmake
命令生成构建系统。
通过cmake --help
可以看到cmake命令支持的详细参数,常用的参数如下:
参数 | 含义 |
---|---|
-S | 指定源文件根目录,必须包含一个CMakeLists.txt 文件 |
-B | 指定构建目录,构建生成的中间文件和目标文件的生成路径 |
-D | 指定变量,格式为-D <var>=<value>,-D后的空格可省略 |
比如,指明使用当前目录作为源文件目录,其中包含CMakeLists.txt
文件;使用build目录作为构建目录;设定变量CMAKE_BUILD_TYPE
的值为Debug
,变量AUTHOR
的值为RealCoolEngineer
:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DAUTHOR=RealCoolEngineer
使用-D设置的变量在CMakeLists.txt中生效,可以设置cmake的内置支持的一些变量控制构建的行为;当然也可以使用自定义的变量,在CMakeLists.txt中自行判断做不同的处理。
2 执行构建
使用cmake --build [<dir> | --preset <preset>]
执行构建。
这里要指定的目录就是生成构建系统时指定的构建目录。常用的参数如下:
参数 | 含义 |
---|---|
--target | 指定构建目标代替默认的构建目标,可以指定多个 |
--parallel/-j [<jobs>] | 指定构建目标时使用的进程数 |
在这一步,如果使用的是make构建工具,则可以在构建目录下直接使用make命令。
三 CMake应用示例
1 一个简单的例子
下面使用cmake编译一个c语言的hello world程序。创建一个项目文件夹cmake-template
,目录结构如下:
cmake-template
├── CMakeLists.txt
└── src
└── c
└── main.c
main.c内容如下:
// @Author: Farmer Li, 公众号: 很酷的程序员/RealCoolEngineer
// @Date: 2021-04-24
#include <stdio.h>
int main(void) {
printf("Hello CMake!");
return 0;
}
CMakeLists.txt的内容如下:
cmake_minimum_required(VERSION 3.12)
project(cmake_template VERSION 1.0.0 LANGUAGES C CXX)
add_executable(demo src/c/main.c)
该CMakeLists.txt声明了需要使用的cmake的最低版本;项目的名字、版本以及编译语言;最后一句定义了通过源文件main.c生成可执行文件demo。
详细的CMake语法在本文暂不展开,后续会有专门的文章介绍,敬请关注(#^.^#)。
2 生成构建系统
在cmake-template
目录下,执行以下命令:
cmake -B build
执行完成后,在项目的根目录下会创建build目录,可以看到其中生成了Makefile
文件。
3 执行构建
还是在cmake-template
目录下,执行以下命令:
cmake --build build
因为使用的是make工具,所以也可以在build目录直接执行make命令:
cd build && make && cd -
执行完成后,可以在build目录下看到已经生成可执行文件demo
,执行demo:
➜ cmake-template # ./build/demo
Hello CMake!
上面演示了一个CMake的简单demo,着重介绍CMake的使用流程和命令。下一篇文章会介绍CMake常用的核心语法和更加复杂的demo。
本文示例代码上传到开源仓库:cmake-template,链接: