Linux系统编程-makefile

76 阅读1分钟

命名方式

只有两种 makefile 和 Makefile,根本没有发挥空间
make执行makefile

makefile执行顺序

默认将第一行作为最终目标,找不到依赖的话才会向下查询,所以需要倒着写,一旦最终目标执行成功就会停止

a.out:hello.o add.o sub.o mul.o
    gcc hello.o add.o sub.o mul.o -o a.out
hello.o:hello.c
    gcc -c hello.c -o hello.o
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
mul.o:mul.c
    gcc -c mul.c -o mul.o

可以使用ALL:目标,来改变执行目标

ALL:a.out
hello.o:hello.c
    gcc -c hello.c -o hello.o
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
mul.o:mul.c
    gcc -c mul.c -o mul.o
a.out:hello.o add.o sub.o mul.o
    gcc hello.o add.o sub.o mul.o -o a.out

1个规则

每一组这个都是一个规则

目标:依赖条件  
    (必须是一个tab)命令

2个函数

  • src=$(wildcard *.c):匹配当前工作目录下的所有.c文件,将文件名组成列表赋值给src
  • obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o:将参数3中包含参数1的部分替换成参数2
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $(obj) -o a.out
hello.o:hello.c
    gcc -c hello.c -o hello.o
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
mul.o:mul.c
    gcc -c mul.c -o mul.o

clean函数

  1. 在命令行使用make clean -n查看clean里的内容,防止你写错
  2. 使用make clean执行clean
clean:
    -rm -rf $(obj) a.out
#rm前面的'-'是为了保证出错了依然执行,不然其中一个文件不存在,你全部删不了
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $(obj) -o a.out
hello.o:hello.c
    gcc -c hello.c -o hello.o
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
mul.o:mul.c
    gcc -c mul.c -o mul.o
clean:
    -rm -rf $(obj) a.out

3个自动变量

  • $@:规则中的目标
  • $<:规则中的第一个依赖。如果使用在模式规则中,他能将依赖列表的所有依赖依次取出,然后套用模式规则。
  • $^:规则中的所有依赖组成的列表,以空格隔开,删除重复项
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $^ -o $@
hello.o:hello.c
    gcc -c $< -o $@
add.o:add.c
    gcc -c $< -o $@
sub.o:sub.c
    gcc -c $< -o $@
mul.o:mul.c
    gcc -c $< -o $@
clean:
    -rm -rf $(obj) a.out

模式规则

因为上面的代码依然有大量的重复部分,使用一句话替代,这样你甚至不用改代码,只需要加文件就行

src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $^ -o $@
%.o:%.c
    gcc -c $< -o $@
clean:
    -rm -rf $(obj) a.out

静态模式规则 = 指定对找不到的依赖执行指定的模式规则

src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $^ -o $@
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
    gcc -c $< -o $@
clean:
    -rm -rf $(obj) a.out

伪目标

你看到clean没有依赖,加上伪目标保证执行 .PHONY: clean ALL

src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
    gcc $^ -o $@
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
    gcc -c $< -o $@
clean:
    -rm -rf $(obj) a.out
.PHONY: clean ALL

添加自定义参数

src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
myArgs= -g
a.out:$(obj)
    gcc $^ -o $@ $(myArgs)
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
    gcc -c $< -o $@
clean:
    -rm -rf $(obj) a.out
.PHONY: clean ALL