目录
1、gcc的工作原理
1.1:过程
其过程为:预处理、编译、汇编、连接。
1.2:处理过程
预处理:gcc -E .c文件 -o .i文件
编译:gcc -S .i文件 -o .s文件
汇编:gcc -c .s文件 -o .o文件
连接:gcc .o文件 -o 目标文件
例如:
gcc -E stu.c -o stu.i
gcc -S stu.i -o stu.s
gcc -c stu.s -o stu.o
gcc stu.o -o stu
还有一种处理方法就是将预处理、编译、汇编结合在一起
gcc -c .c文件 -o .o文件
gcc .o -o 目标文件
gcc -c stu.c -o stu.o
gcc stu.o -o stu
2、Makefile规范
2.1:表达式
目标文件1:依赖文件1
[tap]依赖文件1是如何产生目标文件1的
目标文件2:依赖文件2
[tap]依赖文件2是如何产生目标文件2的
注意以下几点:
1、如果两个文件没有依赖关系则默认执行第一个文件
2、Makefile可以有多个文件
3、有依赖关系的话执行从下到上
4、@可以我们的shell输出语句不输出
yyds:test
@echo"hello"
test:word
@echo"word"
word:
@echo"haha"
2、Makefile中的变量 (变量一般大写)
2.1:预定义变量
CC:c编译器的名称,默认为cc
CLFGAS:c编译器的选项,无默认值
RM:删除文件
2.2自定义变量
我们公认的一些变量(等同于潜规则,虽然没有明确规定,但是大家都知道)
OBJ:用于存放可执行文件的名字
OBJS:用于存放所有的目标文件
2.3:自动变量
$@:表示目标文件
$^:所有的依赖文件
$<:表示第一个依赖文件
2.4:变量定义
变量名:=值
a:=2
b:=uey
c:=jidoa
还有一种方式在这里不再讲,感兴趣的同学可以自己下去了解一下,一般都是在用冒号加等号的方式进行定义
3:演示Makefile的创建
3.1 Makefile的编写
假设在家目录下有三个文件:stu.c io.c sd.c三个文件,生成其相对应的.o文件,并生成可执行文件stu
1、首先创建Makefile文件(makefile中的m大写小写都可以)
vim Makefile
2、编写Makefile
CC:=gcc
CFLGAS:=-c -Wall
OBJS:=stu.o io.o sd.o
stu:$(OBJS)
$(CC) $^ -o $@
stu.o:stu.c
$(CC) $(CFLGAS) $< -o $@
io.o:io.c
$(CC) $(CFLGAS) $< -o $@
sd.o:sd.c
$(CC) $(CFLGAS) $< -o $@
.PHONY clean
clean:
$(RM) *.o
3.2:假目标的解决
假目标的产生,就是Makefile中我们的目标文件和该目录下的文件重名了,这时会出现假目标,不会生成我们想要的目标,所以我们要解决它,方法为在目标文件的上一行加
.PHONY 目标文件
注意:PHONY必须是大写