概念
make/makefile 用于自动化项目的构建
make是命令,makefile是文件
1.先见一见make/makefile
makefile文件中

之后再输入make,可以得到test.exe

2.谈make命令和makefile的依赖关系和依赖方法

在世界上,要完成任何一件事,都是依赖关系和依赖方法的关系
eg:
依赖关系就像你和你爸爸关系
依赖方法:你要生活费
能要到生活费,首先因为你和你爸爸的关系,其次依赖方法正确,你是问他要生活费而不是让他给你写作业。
3.详细学习makefile的基本语法

实践一个例子

前两行构建项目,下面在写一个用来清理项目的依赖关系
细节1:依赖关系必须存在,依赖列表可以为空(就像这的clean)
细节2:依赖方法可以是任意Shell指令
细节3:clean目标,只是利用make的自动推导能力,让他执行了rm命令
在构建工程的视角,看起来就是清理项目。
细节四:make命令后面可以跟目标名

后面跟谁,就解析谁的依赖关系和依赖方法
但我们之前构建test.exe只写了make

这是因为make默认只会推导第一个依赖关系对应的依赖链
.PHONY作用是声明一个伪目标

为什么gcc无法二次编译老文件
时间轴

如果test.c并没有任何改变他就不可能跑到test.exe的前面,再次编译它毫无意义。
那.PHONY是怎么做到重复编译的:
让gcc忽略MOD时间对比新旧
介绍一下文件的三种时间

分别是Access,Modify,Change三种时间
1.Modify
修改文件内容时间(修改文件内容同样会影响文件属性时间)
2.Change
修改文件属性时间
3.Access
访问时间
但不是每次访问都会修改时间,这样会导致效率低下,
所以当访问次数达到一定次数后才会修改
拓展语法
BIN=proc.exe # 定义变量
CC=gcc
#SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名
OBJ=$(SRC:.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表
LFLAGS=-o # 链接选项
FLAGS=-c # 编译选项
RM=rm -f # 引⼊命令
$(BIN):$(OBJ)
@$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表
@echo "linking ... $^ to $@"
%.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同
名.o
@$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。
@echo "compling ... $< to $@" # @:不回显命令
.PHONY:clean
clean:
$(RM) $(OBJ) $(BIN) # $(RM): 替换,⽤变量内容替换它
.PHONY:test
test:
@echo $(SRC)
@echo $(OBJ)

3972

被折叠的 条评论
为什么被折叠?



