CMake 链接

CMake 教程转载

想了解什么是 CMake,首先我们要知道 Make 工具。若源文件、头文件不多,我们可以在命令行中手动写编译命令

1
$ gcc hello.c

但是当项目庞大起来后,假设hello.c依赖与 a.cb.c,而 a.c 又依赖于库 w.lib,每一次编译,我们都要重新编写一次 gcc 编译命令行吗?所以,GNU 发明了 make 这个工具软件,可以编写 makefile 文件来指定特定的项目构建过程,当项目一个文件的代码更改时,我们只需要重新 make 一下就可以了。

虽然make大大简化了项目的构建过程,但依然有很多不足,比如:

  1. make 对于类 unix 系统是通用的,但对 windows 系统并不友好(不能跨平台)
  2. make 语法简单,也就导致了它功能的限制
  3. 不同编译器的语法规则不同,编写的 makefile 语法如果适合 GCC 则不适合 MSVC(不兼容)

所以,CMake就应运而生了。CMake 是比 Make 更高一层的工具,Make 是编写对应编译器的 makefile 从而实现编译,而 CMake 是写一份独立的 CmakeList.txt 文件,然后该文件会根据当前系统环境选择适合的构建生成器(如 VS 或者 make),然后将 CmakeList.txt 翻译为适合的文件,再进一步调用系统编译器进行项目构建。

  • 定义: CMake 是一个跨平台的构建系统生成工具。它用于配置和管理项目的构建过程,可以生成特定构建工具(如 Make 和 Ninja)所需要的构建(配置)文件(如 Makefile 或 build.ninja)。
  • 功能:CMake 提供了一个统一的接口(CMakeLists.txt 文件)来描述项目的构建逻辑,并根据目标平台生成相应的构建文件。CMake 支持多种编译器(不同语言)和构建工具(如 C++的 make 和 Ninja),能够处理复杂的依赖关系和跨平台兼容性问题。

为什么会接触到 CMake

为了开始 CS144 的 lab,我前置除了需要学习 C+ +外,还需要配置好实验的环境,而环境又分为 C+ +的环境和官方给的项目环境,于是…
没错,lab 还没有难到我的时候,环境的配置便给了我当头一棒。除了 C基本的编译工具 gcc/g要安装了解外,还需要 clone 官方的 start code。一开始打算做最新的Minnow版本,但官方对 g++和 Ubuntu 的版本要求太高了,我的 WSL 只是 22.04,完全没达到实验的标准,因此在 cmake 的时候不出所料地遇到了问题 TAT
CMake失败.jpg
由于不想继续折腾系统版本,于是我又去翻到了Sponge版的 start code,继续 cmake,这次终于是没问题了,不过后面 make 进行编译时又又出现了问题
make失败.jpg
原来是libsponge/util/adress.cc没有加上头文件<array>,加上后最终编译成功!至此,终于可以开始愉快的实验了,…吗?make成功.jpg
之所以环境的构建如此坎坷,我觉得最主要的原因是这些工具我完全不了解,所以遇到问题只能上网搜,然后按图索骥地尝试解决问题。当然这样做效率是很低下的,只有跟着解决方法走,实际能不能解决,那就得看最后结果了,我也因此耗费了很多时间。而这个时间我觉得花的并没有价值,只是照葫芦画瓢地搬弄别人给出的方法,而我完全不知道这些操作是什么意思,因此要想真的在这个过程中学到东西,必须是得扎实地去了解这个工具——CMake。

感悟与反思

最近学习C++ Primer Plus时看到一句话:不要害怕犯错误,因为在解决问题的过程中学到的知识,比生搬硬套而不犯错误时要多得多。 我的许多实践都验证过这句话的正确性。确实,在解决错误的过程中我们能学习到很多东西,但是我们不能生搬硬套而不去思考为什么这么做就能解决问题,下次遇到相关的问题我又应该如何解决?授人以鱼不如授人以渔,犯错误是好事,而在寻找解决办法并在痛苦的过程中学习才是犯错带来的最大收益。