linux执行过程
1、-E 预处理:把.h、.c展开形成一个文件。宏定义直接替换头文件、库文件 .i
例:gcc -E hello.c -o hello.i。把hello.c文件进行预处理得到hello.i
2、-S 汇编:
3、-c 编译:C语言编译器gcc、C++编译器是g++
4、-o 链接:
脚本语言:Makefile
- Linux C/C++必须要使用的一个编译脚本
1、创建文本文档,重命名Makefile
2、“#”是注释
第一层:显示规则
1、目标文件.i:依赖文件.c
2、[TAB]指令:
3、第一个目标文件是我的最终目标!!!递归
4、rm -rf hello.o hello.S hello.i hello
5、伪目标: .PHONY:
#c语言的编译过程
#链接
hello:hello.o
gcc hello.o -o hello
#汇编
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
第二层:变量
- 类似于宏定义,后期用于其他工程时,可以直接替换“=”后链接的文件
1、=(替换) +=(追加) :=(常量)
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
#汇编
circle.o:circle.S
$(CC) -c circle.S -o $(OBJ)
#编译
circle.S:circle.i
$(CC) -S circle.i -o circle.S
#预处理
circle.i:circle.c
$(CC) -E circle.c -o circle.i
.PHONY:
clear:
rm -rf $(OBJ) circle.S circle.i circle
第三层:隐含规则
- %.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:
clear:
rm -rf $(OBJ) circle.S circle.i circle
第四层:通配符
- $^ :所有的依赖文件
- $@ :所有的目标文件
- $< :所有的依赖文件的第一个文件