Makefile初汇总
Makefile规则
Makefile常见规则
目标文件:依赖文件
规则(命令)
eg:maintest:main.o input.o output.o
gcc -o maintest main.o input.o output.o
每条命令前面是由TAB键开始,不能使用空格。
Makefile的错误一般有两种:
- Makefile中的命令缩进没有使用TAB键。
- VI等编辑器使用空格代替了TAB键,修改文件etc/vim/vimrc,在末尾添加set noexpandtab语句,取消空格代替TAB键。
Make指令的执行过程
Make指令的执行流程:
一, make指令会在当前目录下以makefile(Makefile)命名的文件。
二, 找到该命名的文件makefile(或Makefile),执行该文件中的命令,生成目标文件。
三, 如果目标文件不存在,或者目标文件没有依赖文件新(依赖文件有更新,目标文件没有更新),
会按照makefile中的命令,去生成目标文件。如果目标文件比依赖文件新,则这条makefile中对应的指令不执行。
(大工程下,只编译修改项目)。
Makefile语法
赋值语句有三种类型:
第一种:“=”。
第一种赋值,即时变量,当给变量执行赋值操作之后,马上生效。起作用的是最后一次对变量的赋值。
第二种:“:=”。
变量在该操作之前已经被赋值,变量取之前的赋值。
第三种:“?=”。
延时赋值。如果该变量之前被赋值,变量取之前的赋值。如果该变量之前没有赋值,变量赋值为该操作的赋值。
变量追加“+=”
此条语句针对字符串,对于变量是字符串。有需要在原来的字符串的基础上,添加新的字符串,需要用到此命令。如下所示:
objects = main.o input.o
objects += output.o
自动变量
通配符:%
通配符表示满足格式的任意字符。如下:
%.o:%.c 文件夹下(待)生成的.c文件依赖于文件夹下的.c文件。
自动变量:
$@:规则中的目标文件集合
$%:当目标是函数库的时候,表示规则中的目标成员名,如果目标不是函数文件,那么其值为空。
$<:依赖文件中的第一个文件。如果是以%.c来表示,$<表示一系列文件。
$?:所有比目标新的依赖文件目标集合
$^:所有的依赖文件集合。对于重复文件只会保留一份
$+:所有的依赖文件集合,但是其不会去除重复文件。
伪目标
在makefile中,目标都是要生成对应的文件。而伪目标不生成对应文件,不代表真正的目标名。执行make指令,通过伪目标来执行伪目标的指令,
避免makefile指令与工作目录下的实际文件出现名字冲突。
以clean指令为例,伪目标clean指令如下:
.PHONY:clean
避免与文件目录下的clean文件相冲突。如下所示(假设目录下有一clean命名的文件,冲突):
clean:
rm *.o