目录
make
工具,可以自动完成编译工作:
1、修改了某几个源文件,只重新编译这几个源文件
2、修改了某个头文件,重新编译所有包含该头文件的源文件
通过Makefile的文件(自行编写)来完成并自动维护编译工作
Makefile(makefile)
规则格式
target: prerequisites
command1
command2
……
命令必须以Tab键开始
make命令会执行Makefile中的以Tab开始的命令
target | 目标文件,是命令执行后生成的目标 |
prerequisites | 要生成target所需要的文件或者是目标 |
command | make需要执行的命令 |
make会从默认目标(第一个目标)往下执行,只要默认目标更新了,就会认为Makefile执行完成。
clean没有依赖文件,会默认为依赖文件都是最新的,所以其对应的命令不会执行。当想执行clean时,使用命令"make clean"
变量
Makefile中的变量都是字符串
变量 | 变量名=字符串 | objects = main.o input.o calcu.o |
引用 | $(变量名) | $(objects) |
注释 | 使用符号'#' | #Makefile变量的使用 |
赋值符
"="
(Makefile中,echo输出一串字符,@echo不会输出命令执行过程)
无论“name”的值在“curname”哪里被赋值,print输出的结果都为“name”最后一次有效赋值的结果
":="
curname := $(name)
结果为"curname"赋值前name的值
"?="
curname ?= zuozongkai
"curname"前面有被赋值,使用之前的值;没有"curname"="zuozongkai"
"+="(变量追加)
objects = main.o input.o calcu.o
模式规则
为了将所有的.c文件编译成.o文件:"a.%.c",表示以a.开头,以.c结束的所有文件
为了通过一行命令来从不同的依赖文件中生成对应的目标:自动化变量
自动化变量 | 描述 |
$@ | 规则中的目标集合。 目标是一个文档文件,它代表这个文档的文件名 在多目标模式规则中,它代表的是触发规则被执行的文件名。 |
$% | 当目标是函数库时,表示规则中的目标成员名;否则,其值为空 |
$< | 依赖文件集合中的第一个文件 如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。 |
$? | 所有比目标新的依赖目标集合,以空格分开 |
$^ | 所有依赖文件的集合,使用空格分开。如果有重复,会保留一份 |
$+ | 与"$^"类似。区别:如有重复,不去除 |
$* | 表示目标模式中"%"及其之前的部分 |
伪目标
一般的目标名都要生成文件,伪目标不需要生成文件。在执行make命令时,通过指定这个伪目标来执行其所在规则定义的命令
避免Makefile中定义的只执行命令的目标(clean)和工作目录下的实际文件名字冲突,导致当执行"make clean"时,目标(clean)因为没有依赖文件,被认为是最新的,后面的命令将不会执行
声明格式