Bootstrap

浅析CMake —— CMake入门详细教程 CMake基本命令和用法

目录

什么是编译?

编译的流程和步骤

Make与CMake是如何工作的?

CMake的常用指令

CMake其他学习资料​​​​​​​​​​​​​

​​​​​​​笔者在初学C++时,认为C++最难以琢磨的部分就是编译过程。面对编译器无情的报错,试着查文档、翻资料,通过改变CMakeList中的微小细节希望奇迹出现,心情也会随之忽上忽下。回过头来看,当时对于编译过程的理解停留在非常浅显的阶段,很多教材也并未解释清楚。这篇博客希望能够在笔者自己的理解基础上,用易懂的语言解释清楚知识点之间的内在联系

什么是编译?

代码其实是我们用来描述逻辑的一种语言,但计算机的处理器并不能理解人类创造出的这种语言。此时你需要一个翻译官,这个翻译官可以把C++程序翻译成一堆由0和1组成的二进制指令,这样计算机就能读懂并执行程序了。

编译是将一段代码(例如C++代码)转换成计算机可以直接理解的机器指令。

代码编译的过程包括预处理编译链接等步骤,最终会生成可由目标计算机直接运行的库或可执行文件。这个编译过程也被称为构建过程(build process)。

编译的流程和步骤

预处理:系统首先会确定需要编译哪些文件、从哪里获取额外的库、应该使用哪些编译器选项。接着,它会判断代码中有哪些部分发生了变动,只有发生变化的文件才会重新编译。

编译:每个源代码文件(例如 .c、.cpp)都会交给编译器进行处理,将人类可读的编程语言转化为较底层的指令,并存储在目标文件(.o 或 .obj)中。

链接:完成编译后,链接器会将所有目标文件和所需的库合并在一起。链接器会解决函数调用和数据引用之间的关系,确保所有引用都指向正确的位置。最终结果是可执行的程序。 

安装:最终生成的可执行文件或库会被放入指定的系统目录,这样就可以轻松访问和运行它们。

想象你有一个大型车间。在开始正式生产前,车间的领班(编译系统)会审阅一份详细的说明书,了解项目所需的部件(源文件)、要使用的工具(库、包含路径)以及相关的安全和质量要求(编译器选项)。这就像工程师试图弄清楚从原材料到精制零件需要哪些步骤和条件。

之后正式进入加工环节,编译器就像一台精密的切割机,它把人类可读的源代码转化为半成品(目标文件)。这些目标文件还不能独立运行,就像加工好的零件仍需组装才能成为最终产品。

在所有零件都加工完成后,由链接器来承担总装的任务。链接器像一位总装工人,将所有目标文件整合在一起,确保零件之间完美契合,没有缺失或重复的部分。通过链接步骤,最终形成可直接由计算机执行的可执行文件。可执行程序会被放入指定的目录,方便直接找到并使用。

Make与CMake是如何工作的?

在编译软件项目时,你需要定义要编译什么、如何编译以及编译的顺序。这时就用到 Makefile和CMake这样的工具。

Makefile —— Makefile直接列出了目标文件的编译规则,以及如何将目标文件链接成可执行文件。但对于大型项目,仅靠一个 Makefile 会变得难以管理。因为你会写下大量繁琐的手动指令,而且这些指令在不同平台上的可移植性很差

CMake —— CMake 不会像Makefile那样直接编译代码。相反,它会读取一个高级别的配置文件(CMakeLists.txt),以此理解整个项目的编译逻辑。CMake 可以让你更轻松地维护、移植和扩展编译配置,因为你只需以更抽象的形式编写一套规则,CMake 就会为你选择的平台和工具生成对应的编译指令。

除了Makefile和CMake以外,Ninja 是一款精简的构建工具,专注于速度和效率,特别针对大型代码库进行了优化,能在增量编译(只重新编译发生变化的文件)中发挥出色的速度优势。

CMake的常用指令

cmake [源码路径]

// mkdir build && cd build
// cmake ../path/to/source

作用:从指定的源码路径下的 CMakeLists.txt 文件生成编译文件​​​​​​​

cmake -S [源码目录] -B [构建目录]

// cmake -S . -B build

作用:将当前目录作为源码目录,在 build 子目录中生成编译文件

cmake -G [生成器名称]

// cmake -S . -B build -G "Ninja"

作用:指定生成器

cmake --build [构建目录]

// cmake --build build

cmake --build [构建目录] --target [目标]

// cmake --build build --target install

作用: 使用已生成的文件编译项目,也可以只编译指定的目标

cmake --install [构建目录]

// cmake --install build

作用: 根据 CMakeLists.txt 中定义的安装规则将目标文件安装到指定位置

CMake其他学习资料​​​​​​​

CMake官网 —— CMake Resources

Modern CMake - GitHub

;