1、Linux编译过程
微观的C/C++编译执行的过程。
C语言 .C -------> .exe
gcc hello.c -o hello.out
过程:
-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(windows环境) 或者.elf文件
gcc hello.o -o hello.out //链接生成可执行文件
2、脚本语言:Makefile
Linux C/C++ 必须要使用的一个编译脚本。
Makefile 大型项目开发。 makefile新的脚本语言
第一层:
#注释
#第一层:显示规则
#目标文件:依赖文件
#【TABLE】指令
#
#第一个目标文件是最终文件,逆序
hello:hello.o
gcc -E hello.o -o hello
hello.o:hello.s
gcc -E hello.s -o hello.o
hello.s:hello.i
gcc -E hello.i -o hello.s
hello.i:hello.c
gcc -E hello.c -o hello.i
以上 ,执行make 命令,显示规则会自动执行。
#注释
#第一层:显示规则
#目标文件:依赖文件
#【TABLE】指令
#
#第一个目标文件是最终文件,逆序
hello:hello.o
gcc -E hello.o -o hello
hello.o:hello.s
gcc -E hello.s -o hello.o
hello.s:hello.i
gcc -E hello.i -o hello.s
hello.i:hello.c
gcc -E hello.c -o hello.i
#rm -rf hello.o hello.s hello.i hello
#伪目标
#.PHONY: #虚伪的 假的
# clear: #伪目标的目标
.PHONY:
clearall:
rm -rf hello.o hello.s hello.i hello # 执行make clearall 自动执行标签代码
clear:
rm -rf hello # 执行make clear 自动执行标签代码
以上,执行make clear 或者make clearall 命令会根据伪标签指定的标签选择执行。
# circle.c circle.h cube.c cube.h main.c main.h
# 得到可以执行的test文件 省去预编译 汇编等
test:circle.o cube.o main.o
gcc circle.o cube.o main.o -o test
circle.o:circle.c
gcc circle.c -o circle.o
cube.o:cube.c
gcc cube.c -o cube.o
main.o:main.c
gcc main.c -o main.o
.PHONY:
clearall:
rm -rf circle.o cube.o main.o test
clear:
rm -rf circle.o cube.o main.o
以上,执行make 自动编译显示规则,执行make clear 执行隐式规则,make clearall隐式规则清楚全部
第二层:
变量
= (替换)
+=追加
:=(常量)
TAR =test
OBJ =circle.o cube.o main.o
CC := gcc
$(TAR) : $(OBJ)
$(CC) $(OBJ) -o $(TAR)
circle.o:circle.c
$(CC) circle.c -o circle.o
cube.o:cube.c
$(CC) cube.c -o cube.o
main.o:main.c
$(CC) main.c -o main.o
第三层:
隐式规则 %.c %.o 任意的.c或者.o
*.c *.o 所有的.c .o
%.o : %.c
$(CC) %.c -o %.o
第四层:
通配符
$^所有的依赖文件
$@所有的目标文件
$<所有的依赖文件的第一个文件
会自动匹配同名的.o .c .s文件
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
RMRF := rm -rf
$(TAR) : $(OBJ)
$(CC) $^ -o $@
%.o : %.c
$(CC) $^ -o $@
.PHONY:
clearall:
$(RMRF) $(OBJ) $(TAR)
clear:
$(RMRF) $(OBJ)
第五层:
函数