MakeFile的简单使用

makefile具体来说就是很复杂,但简单理解就可以当做shell脚本来使,且是跨平台的脚本。

Makefile结构说明

Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。

  1. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

  2. 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 (脚本必备!)

  3. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。

  4. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。

  5. 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符。

简要教程

以一个C语言的编译运行为例:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
printf("Hello, world!\n");
return 0;
}

要先用编译器处理一下,才能运行。

1
2
gcc -o main.exe main.c
main.exe

此时是最简单的情况,如果程序更加复杂,我们该如何处理?

—- 使用makefile脚本!

基本使用

创建一个名为makefile的文件

1
2
3
4
# 编译 运行
cmp: main.c
gcc -o main.exe main.c
main.exe

我们使用makefile文件将两个步骤合二为一,使用mingw32-make cmp 完成编译和运行。

需要注意的是,make命令与当前环境使用的C编译器有关!如果你用MinGW,你的make 叫 mingw32-make 如果你用MSVC,你的make叫 nmake ….

使用变量

1
2
3
4
5
6
7
# 编译 运行
in=main.c
out=main.exe

cmp:
gcc -o $(out) $(in)
$(out)

接收参数

只需在上述的基础上,改变运行命令的参数,就会覆盖makefile文件中的变量值。

1
mingw32-make cmp in=main.c out=main.exe

扩展应用

有了以上的概述,不止于编译连接运行。我们可以将makefile用做跨平台的shell脚本。

如:

1
2
3
4
5
#新建删除文件
clean:
md some_directory
rd /s /q some_directory
del main.exe

参考:

https://zhuanlan.zhihu.com/p/47390641

https://www.coonote.com/linux-note/makefile-simple-tutorial.html