目标文件:依赖条件
[TAB键] 命令
main:main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
main.o:main.c
gcc -c main.c
input.o:input.c
gcc -c input.c
calcu.o:calcu.c
gcc -c calcu.c
clean:
rm *.o
rm main
变量
#定义一个变量objects
objects = main.o input.o calcu.o
#使用变量objects,用$(变量名)
main:$(objects)
gcc -o main $(objects)
main.o:main.c
gcc -c main.c
input.o:input.c
gcc -c input.c
calcu.o:calcu.c
gcc -c calcu.c
clean:
rm *.c
rm main
赋值符“=”
name = wxy
curname = $(name)
name = wxyy123
print:
@echo curname: $(curname)
make print 打印wxyy123 为所赋值变量的最后的值
赋值符“=”借助另外一个变量,可以将变量的真实值推到后面去定义,也就是变量的真实值取决于他所引用的变量的最后一次有效值。
赋值符“:=”
name = wxy
curname := $(name)
name = wxyy123
print:
@echo curname: $(curname)
make print 打印 wxy
赋值符":="不会使用后面定义的变量,只能使用前面已经定义好的
赋值符"?="
curname ?= wxy
上述代码的意思是,如果变量curname前面没有被赋值,那么变量就是wxy,如果前面已经赋过值,那么就使用前面赋的值
curname = wxyy123
curname ?= wxy
print:
@echo curname: $(curname)
变量追加"+="
objects = main.o input.o
objects += calcu.o
Makefie的模式规则:
% 表示对文件名的匹配,%表示长度任意的非空字符串,比如"%.c"就是所有以.c结尾的文件,再比如a.%.c就表示以a.开头,以.c结束的所有文件
%.o:%.c
#命令
之前的Makefile简化:
objects = main.o input.o calcu.o
main:$(objects)
gcc -o main $(objects)
%.o:%.c
#命令
clean:
rm *.o
rm main
Makefile自动化变量:
常用三种:$@、$<、$^
$@ | 规则中的目标集合,在规则模式中,如果有多个目标的话,"$@"表示匹配模式中定义的目标集合。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即"%")定义的,那么“$<”就是符合模式的一系列的文件集合 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复文件,$^会去除重复的依赖文件,值保留一份 |
上述Makefile补充为:
objects = main.o input.o calcu.o
main:$(objects)
gcc -o main $(objects)
%.o:%.c
gcc -c $<
clean:
rm *.o
rm main
Makefile伪目标
使用伪目标是为了避免Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突。为了避免文件夹中存在clean文件,导致目标被认为是最新的,我们可以将clean声明为伪目标,如下:
.PHONY:clean
Makefile的条件判断:暂略
ifeq、ifneq、ifdef、ifndef......