CMake应用:基础篇
什么是CMake?
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 =
比如,指明使用当前目录作为源文件目录,其中包含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 [
这里要指定的目录就是生成构建系统时指定的构建目录。常用的参数如下:
参数含义
--target
指定构建目标代替默认的构建目标,可以指定多个
--parallel/-j [
指定构建目标时使用的进程数
在这一步,如果使用的是make构建工具,则可以在构建目录下直接使用make命令。
三 CMake应用示例
1 一个简单的例子
下面使用cmake编译一个c语言的hello world程序。创建一个项目文件夹cmake-template,目录结构如下:
cmake-template
├── CMakeLists.txt
└── src
└── c
└── main.c
main.c内容如下:
#include
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。
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应用:核心语法篇
本文是深入CMakeLists.txt之前的前导文章,介绍CMake语言的核心概念,以及常用的CMake脚本命令,以期对CMake的语法能有比较好的认知和实践基础。
在前一篇文章中介绍了CMake的核心概念,使用的一般流程,并通过一个实例讲解了CMake命令行工具之一的cmake命令的使用方法。
在开始深入如何编写完备的CMakeLists.txt之前,先了解下CMake的语言和它的组织方式对后续内容的理解是很有帮助的。本文将会介绍以下内容:
CMake语言的核心概念
CMake常用脚本命令及示例
一 CMake语法核心概念
下面介绍的内容,可以只先有一些概念,不求甚解,在后续需要深入的时候查看文档即可。
CMake的命令有不同类型,包括脚本命令、项目配置命令和测试命令,细节可以查看官网cmake-commands。
CMake语言在项目配置中组织为三种源文件类型:
目录:CMakeLists.txt,针对的是一个目录,描述如何针对目录(Source tree)生成构建系统,会用到项目配置命令;
脚本: