1.1 gcc编译流程
(1)
预处理gcc -E test.c -o test.i (处理#开头的文件)
编译: gcc -S test.i -o test.s (生成汇编代码)
汇编: gcc -c test.s -o test.o (将汇编语言转换成机器代码)
链接: gcc test.o -o test(与其它的机器代码文件和库文件汇聚生成一个可执行文件)
(2)gcc test.c -o test
1.2多文件编译:
将gcc的前三步合3为1:
gcc -c stu.c -o stu.o
gcc -c stu.c -o stu.o
gcc -c io.c -o io.o
gcc-c sort.c -o sort.o
gcc -c sumscores.c -o sumscores.o
将.o文件汇聚成一个可执行文件
gcc stu.o io.o sort.o calPmaxAge.o swap.o -o test
1.3 Make工程管理器
make: 工程管理器
make:会在当前路径下找一个叫做Makefile的文件(注意:M大写或小写都可以)
Makefile命名规范
目标文件1: 依赖文件1
(Tab键) 依赖文件1是如何生成目标文件1的
目标文件2: 依赖文件2
(Tab键) 依赖文件2是如何生成目标文件2的
注意:
(1) 目标文件1和目标文件2没有联系时,默认执行目标文件1
(2) 一个Makefile中可以有多个目标文件
无联系
有联系
(3)在调用make时,需要指定我们要运行的目标是什么,如果没有执行,默认执行目标文件1
make test
案例:
注意: 在构建yyds先会构建test
clean:
rm *.o
make clean
假目标:
clean清不掉
如何解决:
在clean前面加. PHONY(假的、伪造的)
.PHONY:clean
clean:
rm *.o
如何解决假目标:
在clean前面加上.PHONY
1.4变量
预定义变量
CC: c编译器名称,默认为cc
CFLAGS:c编译器的选项,无默认值
RM:文件删除默认名称,默认rm -rf(强制删除)
自定义变量:
OBJ和OBJS:一个用于存放可执行文件,一个用于存放所有的目标文件
自动变量:
$@:目标文件
$<:表示第一个依赖文件
$^:表示所有的依赖文件
变量定义的两种方式
(1)递归方式: VAR=var
注意:后面的值会影响前面的值
(2)简单方式:VAR:=var
1.5嵌套makefile
(1)创建文件夹
include(.h 头文件) src(*.c 文件) obj (*.o 文件) bin(可执行文件)
(2) 编写总的Makefile,先书写自定义变量或预定义变量
(3) 编写src中的Makefile,将所有的.c文件编译成.o文件 将.o文件移动到.obj
(4)将所有的.o文件编译生成可执行文件,将可自行文件移动到bin目录下
(5) 编写中控的Makefile 先执行src中的Makefile在执行 obj中的Makefile