概述
-
Makefile是类似于shell的一种脚本文件,其描述了整个工程所有文件的编译顺序、编译规则,实现了“自动化编译”的效果,免去了手动编译时带来的麻烦,且在Makefile中可以使用系统shell所提供的任何命令来完成想要的工作。
-
make是一个命令工具,它为Makefile脚本文件进行解释。当make 命令被执行时,它会扫描当前目录下Makefile找到目标以及其依赖。如果这些依赖自身也是目标,继续为这些依赖扫描Makefile 建立其依赖关系,然后编译它们。
-
Makefile文件可以使用“GNUmakefile”,“makefile”,“Makefile”命名,make命令执行时根据此命名的查找顺序,首先找到那个就读取那个。
-
C语言编译过程简图
Makefile的规则
-
Makefile脚本格式
目标文件 : 依赖文件 [Tab]命令
-
依赖文件即是生成目标文件所需要的文件,当目标文件不存在或依赖文件比目标文件新时执行命令(任意的shell命令)。
-
命令前有一个[Tab]的缩进
示例
- 把a.c,b.c,c.c三个源文件编译成test程序:
-
在工程目录下创建Makefile文件
$ ls a.c b.c c.c Makefile
-
编写Makefile文件
test : a.o b.o c.o gcc a.o b.o c.o -o test a.o : a.c gcc -c a.c -o a.o b.o : b.c gcc -c b.c -o b.o c.o : c.c gcc -c c.c -o c.o
-
执行make命令(当有多个目标时,只用make默认执行第一个)
$ make gcc -c a.c -o a.o gcc -c b.c -o b.o gcc -c c.c -o c.o gcc a.o b.o c.o -o test $ ls a.c a.o b.c b.o c.c c.o Makefile test
-
Makefile文件中可以使用通配符% *,且在编译过程中生成了很多.o文件,可以使用clean清除,上面的Makefile可简写:
test : a.o b.o c.o gcc $^ -o test %.o : %.c gcc -c $< -o $@ clean : rm *.o test .PHONY: clean
-
使用rm *.o可执行文件名 ,在终端输入make clean命令就可以自动清除。
-
在clean前面加.PHONY意为把clean设为伪目标,避免了与名为clean的文件的冲突(当使用make命令行指定此目标时,这个目标所在规则定义的命令、无论目标文件是否存在都会被无条件执行)
-
$@表示目标
-
$<表示第一个依赖文件
-
$^表示所有依赖文件
变量
符号说明
- "=" 延时变量,在引用时才展开
- ":=" 及时变量,在定义时就直接展开,不能引用之后定义的变量。如果引用一个未定义的变量,则为空
- "?=" 表示如果此变量在之前没有定义,就赋值,否则保持原值
- "+=" 追加方式来实现对一个变量值的追加操作
示例
A := $(C) # $()的方式引用变量
B = $(C)
C = abc
D = nb666
D ?= 2333
all:
@echo A = $(A) # 命令前面加@不打印该命令
@echo B = $(B)
echo D = $(D)
C += 123
- 执行
$ make
A =
B = abc 123
echo D = nb666
D = nb666