Makefile与Shell脚本类似,是一系列命令的集合。用于项目代码编译管理。其定义了一系列的规则来指定文件是否需要编译以及编译顺序,甚至进行更复杂的功能操作。
目标:依赖条件
[Tab]命令 // 注:命令若另起一行,命令前必须为[Tab键]
目标:要生成的文件
依赖条件:
命令:
makefile1:
hello.o:hello.c
[一个Tab键]gcc -c hello.c -o hello.o
makefile2:
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
当存在多个文件联合编译生成一个可执行文件时,可对比出makefile1与makefile2的优劣。
makefile3 :直接将所有文件编译并链接
a.out:111.c 222.c 333.c
gcc 111.c 222.c 333.c -o a.out
makefile4 :分别将每个文件编译,然后将每个 .o 文件进行链接
a.out:111.o 222.o 333.o
gcc 111.o 222.o 333.o -o a.out
111.o:111.c
gcc -c 111.c -o 111.o
222.o:222.c
gcc -c 222.c -o 222.o
333.o:333.c
gcc -c 333.c -o 333.o
makefile5 :此时,目标的顺序不再受限。
all:a.out
a.out:111.o 222.o 333.o
gcc 111.o 222.o 333.o -o a.out
111.o:111.c
gcc -c 111.c -o 111.o
222.o:222.c
gcc -c 222.c -o 222.o
333.o:333.c
gcc -c 333.c -o 333.o
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
all:a.out
a.out:$(obj)
gcc $(obj) -o a.out
111.o:111.c
gcc -c 111.c -o 111.o
222.o:222.c
gcc -c 222.c -o 222.o
333.o:333.c
gcc -c 333.c -o 333.o
我们生成了多个编译文件,Makefile存在一个清除目标文件的规则,规则如下:
clean:
rm a.out
更为稳健的做法是:.PHONY表示clean是一个伪目标;“-”表示出错依然执行。不成文的规定“clean”规则一般放在文件最后。
.PHONY:clean
clean:
-rm -rf a.out
makefile7 :
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
all:a.out
a.out:$(obj)
gcc $(obj) -o a.out
111.o:111.c
gcc -c 111.c -o 111.o
222.o:222.c
gcc -c 222.c -o 222.o
333.o:333.c
gcc -c 333.c -o 333.o
.PHONY:clean
clean:
-rm -rf $(obj) a.out
执行clean的命令为 “make clean”,以防万一,酿成大祸,建议先执行“make clean -n”,预执行一下,观察结果正确后,再执行“make clean”。
在makefile7的基础上,引入自动变量:
makefile8 :
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
all:a.out
a.out:$(obj)
gcc $^ -o $@
111.o:111.c
gcc -c $< -o $@
222.o:222.c
gcc -c $< -o $@
333.o:333.c
gcc -c $< -o $@
.PHONY:clean
clean:
-rm -rf $(obj) a.out
%.o:%.c
gcc -c $< -o $@
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
all:a.out
a.out:$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
.PHONY:clean #强制执行
clean:
-rm -rf $(obj) a.out
静态模式规则:表示对哪一个依赖条件套用模式规则
$(obj)%.o:%.c
gcc -c $< -o $@
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
all:a.out
a.out:$(obj)
gcc $^ -o $@
$(obj)%.o:%.c
gcc -c $< -o $@
%.o:%.s
gcc -S $< -o ...
.PHONY:clean #强制执行
clean:
-rm -rf $(obj) a.out
伪目标:.PHONY:clean all #强制执行
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
c_flags = -Wall -g
all:a.out
a.out:$(obj)
gcc $^ -o $@ $c_flags
$(obj)%.o:%.c
gcc -c $< -o $@ $c_flags
%.o:%.s
gcc -S $< -o ...
.PHONY:clean #强制执行
clean:
-rm -rf $(obj) a.out
= 与 :=
= 是最基本的赋值回
:= 是覆盖之前的值
?= 是如果答没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
万能makefile地址