【Linux系统编程】9.Makefile

目录

1个规则

ALL

2个函数

wildcard

patsubst

clean

3个自动变量

模式规则

静态模式规则

伪目标

附加变量

-n

-f

命名:makefile或者Makefile,方便于make命令直接执行。

1个规则

  1. 目标的时间必须晚于依赖条件的时间,否则,更新目标。

  2. 依赖条件如果不存在,找寻新的规则去产生依赖条件。

目标:依赖条件
	命令
main.out:main.c
	gcc main.c -o main.out

ALL

指定makefile的终极目标。

ALL:终极目标
ALL:main.out

不指定,在某些情况下,Makefile不会全部执行完。

例如:

ALL:main.out

a1.o:a1.c
	gcc -c a1.c -o a1.o
	
a2.o:a2.c
	gcc -c a2.c -o a2.o
	
a3.o:a3.c
	gcc -c a3.c -o a3.o
	
main.o:main.c
	gcc -c main.c -o main.o
	
main.out:main.o a1.o a2.o a3.o
	gcc main.o a1.o a2.o a3.o -o main.out

2个函数

wildcard

src=$(wildcard ./*.c)
src=a1.c a2.c a3.c

匹配当前工作目录下的所有.c文件,将文件名组成列表,赋值给变量src

patsubst

obj=$(patsubst %.c,%.o,$(src))
obj=a1.o a2.o a3.o

将第3个参数中,包含第1个参数的部分,替换为第2个参数。

clean

没有依赖。第一个“-”:删除不存在的文件时,不报错,继续执行。

clean:
	-rm -rf $(obj) xxx.out

3个自动变量

$@

在规则的命令中,表示规则的目标。

$^

 在规则的命令中,表示所有的依赖条件。

$<

        在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可以将依赖条件列表中的依赖依次取出,套用模式规则。

src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

a1.o:a1.c
	gcc -c $< -o $@

a2.o:a2.c
	gcc -c $< -o $@

a3.o:a3.c
	gcc -c $< -o $@
	
main.o:main.c
	gcc -c $< -o $@
	
clean:
	-rm -rf $(obj) main.out

模式规则

%.o:%.c
	gcc -c $< -o $@
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

%.o:%.c
	gcc -c $< -o $@
	
clean:
	-rm -rf $(obj) main.out

静态模式规则

多个目标存在时,优先执行。

$(obj):%.o:%.c
	gcc -c $< -o $@
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

$(obj):%.o:%.c
	gcc -c $< -o $@
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out

伪目标

存在同名clean文件和目标时,makefile可继续执行。

.PHONY:clean ALL
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

$(obj):%.o:%.c
	gcc -c $< -o $@
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out
	
.PHONY:clean ALL

附加变量

src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

myArgs=-Wall -g

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@ $(myArgs)

$(obj):%.o:%.c
	gcc -c $< -o $@ $(myArgs)
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out
	
.PHONY:clean ALL

-n

模拟执行,防止出错,尤其是make clean命令。

make clean -n

-f

指定文件执行make命令。

make -f 文件名
make -f xxx.mk

猜你喜欢

转载自blog.csdn.net/CETET/article/details/130062384
今日推荐