之前的博客C语言编译器工作原理以及.h和.c文件解析中比较详细的介绍了编译器的编译过程,以及它是如何处理多文件编译问题的。但是在工程项目比较庞大以及需要链接外部库的时候,手动编写Makefile往往比较繁琐,一个比较好的解决方式是使用CMake工具自动生成工程项目的Makefile。
CMake介绍
CMake是一个开源的跨平台自动化构建系统。它可以产生不同系统平台的构建文件(e.g., 类Unix系统的Makefile,Window系统的.vcproj)。可以方便的用于工程项目的管理。
大部分内容来自Introduction to CMake by Example
CMake 安装(Ubuntu)
1 | $ sudo apt-get install cmake //install CMake |
The Hello World Example
首先创建一个HelloWorld.cpp文件,包含以下代码:
1 |
|
在相同目录下创建一个CMakeLists.txt文件(存放CMake命令的标准文件),包含一下内容:
1 | cmake_minimum_required(VERSION 3.5.1) |
CMakeLists.txt中包含三行:
- 第一行的
cmake_minimum_required()
命令指定了该工程的最小CMake版本,设置为自己系统中的CMake版本即可。 - 第二行的
project()
命令设置了工程的名字。 - 第三行的
add_executable()
命令,第一个参数为生成的可执行文件的名字,第二个参数指定需要编译的源文件。两个参数之间用空格隔开。
接下来在CMakeLists.txt同一目录下执行以下命令:
1 | $ cmake . |
“.”表示当前目录。
执行完毕后,在同一目录下会生成一些文件,最重要的是生成了Makefile文件,接下来用make命令来编译链接以生成可执行文件:
1 | $ make |
之后会在同一目录下生成hello
可执行文件,运行:
1 | $ ./hello |
会在终端中打印出以下信息:
1 | Hello World! |
补充
执行cmake .
命令后我们发现多出的一些文件会使得整个工程看起来比较混乱,而我们只需要用到其中的Makefile文件。所以比较推荐的做法是,在同一目录下新建一个build
文件夹用来存放cmake命令之后产生的文件,而当我们不需要这些文件的时候只需要将build文件夹下的文件删除。下面是具体的命令:
1 | $ mkdir build |
清除cmake文件
1 | $ sudo rm -rf build/* |
总结
虽然只编译一个HelloWorld.cpp我们完全没有必要使用CMake,但我们通过这个例子解释了CMake的一些基本操作,可以用于后面更复杂的例子。
参考链接
Introduction to CMake by Example
Jermmy’s Lazy Blog–cmake学习笔记