CMake教程
CMake 链接
想了解什么是 CMake
,首先我们要知道 Make
工具。若源文件、头文件不多,我们可以在命令行中手动写编译命令
1 | $ gcc hello.c |
但是当项目庞大起来后,假设hello.c
依赖与 a.c
、b.c
,而 a.c
又依赖于库 w.lib
,每一次编译,我们都要重新编写一次 gcc 编译命令行吗?所以,GNU 发明了 make
这个工具软件,可以编写 makefile
文件来指定特定的项目构建过程,当项目一个文件的代码更改时,我们只需要重新 make 一下就可以了。
虽然make
大大简化了项目的构建过程,但依然有很多不足,比如:
- make 对于类 unix 系统是通用的,但对 windows 系统并不友好(不能跨平台)
- make 语法简单,也就导致了它功能的限制
- 不同编译器的语法规则不同,编写的 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
由于不想继续折腾系统版本,于是我又去翻到了Sponge
版的 start code,继续 cmake,这次终于是没问题了,不过后面 make 进行编译时又又出现了问题
原来是libsponge/util/adress.cc
没有加上头文件<array>
,加上后最终编译成功!至此,终于可以开始愉快的实验了,…吗?
之所以环境的构建如此坎坷,我觉得最主要的原因是这些工具我完全不了解,所以遇到问题只能上网搜,然后按图索骥地尝试解决问题。当然这样做效率是很低下的,只有跟着解决方法走,实际能不能解决,那就得看最后结果了,我也因此耗费了很多时间。而这个时间我觉得花的并没有价值,只是照葫芦画瓢地搬弄别人给出的方法,而我完全不知道这些操作是什么意思,因此要想真的在这个过程中学到东西,必须是得扎实地去了解这个工具——CMake。
感悟与反思
最近学习C++ Primer Plus时看到一句话:不要害怕犯错误,因为在解决问题的过程中学到的知识,比生搬硬套而不犯错误时要多得多。 我的许多实践都验证过这句话的正确性。确实,在解决错误的过程中我们能学习到很多东西,但是我们不能生搬硬套而不去思考为什么这么做就能解决问题,下次遇到相关的问题我又应该如何解决?授人以鱼不如授人以渔,犯错误是好事,而在寻找解决办法并在痛苦的过程中学习才是犯错带来的最大收益。