Makefile
1.是什么:
-
一个不普通的文本文件
-
普通是因为它就是一个文本文件
-
不普通是因为他可以辅助完成各种大型项目的编译,主要make这个程序
2.作用:
- makefile用于记录这些项目中的编译规则,而make这个程序只是
解释makefile中的这些编译规则,逐条解释(make只是解释这些规则,
而编译工作还是最后由编译器来处理)
3.编写规则
-
Makefile文件命名规则
makefile/Makefile
2.注释
‘#’号开头
3.编写规则
a.对象名称:依赖的对象名称 b.[Tab][\t] 为了生成对象所执行的命令
make 执行规则
-
1.先找到目标文件
-
只生成第一个对象,当第一个对象执行完退出,想要执行其他的对象,定义第一个对象为all:后面添加所有的依赖对象
-
2.找到目标文件后,根据依赖的时间属性判断是否为最新的,判断是否需要编译如果为最新的就不会再编译
-
3.执行为了生成对象所需的命令
这条命令,不一定非要生成目标对象 -
4.make 在直接在外部指定要执行生成的对象(make clean)
4.伪对象
- 概念:
- 伪对象中的不管对象是不是最新的,都需要重新生成
- 申明的格式
-
.PHONY: 定义伪对象关键字
-
将clean声明为伪对象,就是为了防止外部有和clean同名的文件,导致出现因为引用文件最新而不重新执行命令的问题
.PHONY: celan clean: tal键 rm test
5.预定义变量
-
用于执行命令
-
$@ : 目标对象
-
$^ : 所有的依赖对象
-
$<:所依赖对象中的第一个
-
$(): 用于使用一个变量
-
wildcard : 关键字,用于获取文件名 ```src=$(wlidcard ./*.c)
定义一个变量获取当前路径下所有的.c 文件名
6. = := ?= += 他们之间有什么区别
- = 是最基本的赋值,修改整个makefile的同名变量的值
-
“=”这是递归展开式变量 定义若是引用了其他变量,引用会一直展开下去直到找到别引用变量的最新定义,并以此为变量的值返回
例子: x = foo y = $(x) bar
-
List item
x = xyz 最后y为xyz 他展开的整个makefile,makefile中的值是最后定义的值
- := 是覆盖之前的值,变量在不同位置的值不同,他只修改在:=之后的值,之前的值不管
-
“:=”(计时赋值) 简单展开变量 这种方式定义的变量,会在变量的定义点,
按照被引用的变量的当前值进行展开()例子: x := foo y := $(x) bar x := xyz 在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
-
:= 表示变量的值取决于它在makefile中的位置而不是整个makefile展开后的最终值。
-
+= 是添加等号后面的值
“+=”与“=”功能几乎相同,但是当变量已经有定义时,+=只是简单的进行字符添加工作
-
?= 是如果没有被赋值过就赋予等号后面的值
“?=”赋予默认值,没有初始化该变量,就给它赋上默认值