IDE过程: 预处理(宏 头文件展开) —> 编译(编为汇编代码) —> 汇编(将汇编代码转换为机器码) —>链接.
makefile是一种脚本语言
第一层:显示规则
- #代表注释
- 目标文件:依赖文件
[TAB]指令
hello.i:hello.c
gcc -E hello.c -o hello.i
gcc编译过程:
hello.i:hello.c
gcc -E hello.c -o hell.i #预编译
hello.S:hello.i
gcc -S hello.i -o hello.S #汇编
hello.o:hello.S
gcc -c hello.S -o hello.o #编译
hello:hell.o
gcc hell.o -o hello #链接
- 第一个目标文件是我们最终目标!!!! 递归生成
- 伪目标:.PHONY
简单的Makefile例(hello.c):
hello:hello.o #递归依赖生成hello,hello是最终生成目标
gcc hello.o -o hell
hello.o:hello.S
gcc -c hello.S -o hello.o
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.i:hello.c
gcc -E hello.c -o hello.i
.PHONY: #固定格式,伪目标
clear:
rm -rf hello.o hello.S hello.i hello
第二层:变量
- 变量
- = —> 替换
TAR = hello —>后面的TAR都是hello - += —>追加
TAR += hell1 —>TAR就是hello跟hello1 - := —>恒等于
CC := gcc —>CC就是gcc
Makefile例(circle.c circle.h main.c main.h):
test: circle.o main.o
gcc circle.o main.o -o test
circle.o: circle.c #不用添加circle.h 已自动包含
gcc -c circle.c -o circle.o
main.o: main.c #不用添加main.h 已自动包含
gcc -c main.c -o main.o
.PHONY:
clear:
rm -f circle.o main.o test
使用第二层功力后:
TAR = test
OBJ = circle.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $(OBJ) -o TAR
circle.o: circle.c #不用添加circle.h 已自动包含
$(CC) -c circle.c -o circle.o
main.o: main.c #不用添加main.h 已自动包含
$(CC) -c main.c -o main.o
.PHONY:
clear:
rm -f $(OBJ) test
第三层:隐含规则
- %.c —>任意的.c 文件
- %.o —>任意的.o文件
- *.c —>所有的 .c文件
- *.o —>所有的 .o文件
使用三层功力后:
TAR = test
OBJ = circle.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $(OBJ) -o TAR
%.o : %.c #任意的 .c 文件皆可生成任意测 .o 文件
$(CC) -c %.c -o %.c
.PHONY:
clear:
rm -f $(OBJ)
第四层: 通配符
- $^ —>所有的依赖文件
- $@ —>所有的目标文件
- $< —>所有 依赖文件的第一个文件
使用第四层功力后:
TAR = test
OBJ = circle.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $^ -o $@
%.o : %.c #任意的 .c 文件皆可生成任意测 .o 文件
$(CC) -c $@ -o $^
.PHONY:
clear:
rm -f $(OBJ)