CMake应用:基础篇

CMake是一个开源、跨平台的编译、测试和打包工具,它使用比较简单的语言描述编译、安装的过程,输出Makefile或者project文件,再去执行构建。

在使用IDE开发软件的过程中,代码的编译和构建一般是使用IDE自带的编译工具和环境进行编译,开发者参与的并不算多。如果想要控制构建的细节,则需要开发者自己定义构建的过程。

本文主要介绍以下内容:

  1. 编译构建相关的核心概念及它们之间的关系
  2. CMake的一般使用流程
  3. 一个简单的实例

一 核心概念

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一般流程为:

  1. 生成构建系统(buildsystem,比如make工具对应的Makefile);
  2. 执行构建(比如make),生成目标文件;
  3. 执行测试、安装或打包。

本文先介绍前面两个步骤。

1 生成构建系统

通过cmake命令生成构建系统。

通过cmake --help可以看到cmake命令支持的详细参数,常用的参数如下:

参数 含义
-S 指定源文件根目录,必须包含一个CMakeLists.txt文件
-B 指定构建目录,构建生成的中间文件和目标文件的生成路径
-D 指定变量,格式为-D <var>=<value> ,-D后的空格可省略

比如,指明使用当前目录作为源文件目录;使用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 LANGUAGE 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。

本文示例代码上传到开源仓库:
FarmerLi / cmake-template

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章