C++编译执行过程
C/C++ -> exe ?
- -E 预处理: 把.h .c展开成一个文件宏定义直接替换 -> .i
- gcc -E hello.c -o hello.i
- -S 汇编: .i生成一个汇编代码文件 .S
- gcc -S hello.i -o hello.S
- -c 编译: .S生成一个 .o .obj
- gcc -c hello.S -o hello.o
- -o 链接: .o链接生成 .exe .elf(linux)
- gcc hello.o -o hello
存在问题: 若有多个文件,生成可执行文件会很复杂.
脚本语言:Makefile
借助编译脚本,提升编译效率.
第一层
- 格式
- 显式规则
- #是注释
- 目标文件:依赖文件
- [tab]指令
- 第一个目标文件是我们最终要生成的文件,使用递归的方式.
- 伪目标: .PHONY:
- 实例
#链接
hello:hello.o
gcc hello.o -o hello
#编译
hello.S:hello.o
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:
#使用make clear清空中间生成文件
clear:
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:
clearall:
rm -rf $(OBJ) $(TAR)
clear:
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:
clearall:
rm -rf $(OBJ) $(TAR)
clear:
rm -rf $(OBJ)
第四层
- 通配符
- 实例
TAR=test
OBJ=circle.o cube.o main.o
CC:=gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $@
%.o:%.c
$(CC) -c %.c -o %.o
第五层
- 函数
详细资料链接: http://c.biancheng.net/view/7093.html