最基本的规则

#是注释
目标文件:依赖文件
[TAB]指令
第一个目标文件是我们的最终目标!!!递归
伪目标 .PHONY: (不是为了生成某个目标,只是单纯的想执行某条命令)
例如:rm -rf hello.o hello.S hello.i hello

第一层 显示规则

hello:hello.o
    gcc hello.o -o hello
hello.o:hello.S
    gcc hello.S -o hello.o
hello.S:hello.i
    gcc hello.i -o hello.S
hello.i:hello.c
    gcc hello.c -o hello.i
.PHONY:
clean:
    rm -rf hello.o hello.S hello.i hello

第二层 变量= 追加+= :=恒等 使用$(变量名)替换

TAR=test
OBJ=circle.o cube.o main.o
CC:=gcc
$(TAR):$(OBJ)
    $(CC) $(OBJ) -o $(TAR)
circle.o:circle.c
    $(CC) -c circle.c -o circle.o
cube.o:cube.c
    $(CC) -c cube.c -o cube.o
main.o:main.c
    $(CC) -c main.c -o main.o
.PHONY:
cleanall:
    rm -rf $(OBJ) $(TAR)
clean:
    rm -rf $(OBJ)

第三层 隐含规则 %.c %.o 任意的.c .o .c.o所有.c .o

TAR=test
OBJ=circle.o cube.o main.o
CC:=gcc
$(TAR):$(OBJ)
    $(CC) $(OBJ) -o $(TAR)
%.o:%.c
    $(CC) -c %.c -o %.o
.PHONY:
cleanall:
    rm -rf $(OBJ) $(TAR)
clean:
    rm -rf $(OBJ)

第四层 通配符 $^所有的依赖文件 $@所有的目标文件 $<所有依赖文件的第一个文件

TAR=test
OBJ=circle.o cube.o main.o
CC:=gcc
$(TAR):$(OBJ)
    $(CC) $^ -o $@
%.o:%.c
    $(CC) -c $^ -o $@
.PHONY:
cleanall:
    rm -rf $(OBJ) $(TAR)
clean:
    rm -rf $(OBJ)

第五层 函数

最后修改:2022 年 04 月 24 日
如果觉得我的文章对你有用,请随意赞赏