一、Makefile规则格式
目标……: 依赖文件集合 (Tab键)命令1 (Tab键)命令2 (Tab键)命令3 ……
先判断依赖文件是否存在,存在才依次运行命令
main: main.o input.o calcu.o gcc -o main main.o input.o calcu.o main.o: main.c gcc -c main.c input.o: input.c gcc -c input.c calcu.o: calcu.c gcc -c calcu.c clean: rm *.o rm main
首先更新第一条规则中的 main,第一条规则的目标成为默认目标,只要默认目标更新了那么就认为 Makefile 的工作。
在第一次编译的时候由于 main 还不存在,因此第一条规则会执行,
第一条规则依赖于文件 main.o、 input.o 和 calcu.o 这个三个.o 文件,这三个.o 文件目前还都没有,因此必须先更新这三个文件。 make 会查找以这三个.o 文件为目标的规则并执行。
以 main.o为例,发现更新 main.o 的是第二条规则,因此会执行第二条规则,第二条规则里面的命令为“gcc–c main.c”,这行命令很熟悉了吧,就是不链接编译 main.c,生成 main.o,其它两个.o 文件同理。
因此Makefile工作流程是:
1、 make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比
目标文件晚)的话就会执行后面的命令来更新目标。
二、Makefile变量
#Makefile 变量的使用 objects = main.o input.o calcu.o main: $(objects) gcc -o main $(objects)
- Makefile注释用 “#”
- 定义了一个变量 objects,变量引用用 $(变量名)
- 等号 =
name = zzk curname = $(name) name = zuozhongkai print: @echo curname: $(curname) #如果最后一行不加@,就会将运行过程一起打印出来
打印结果是最后一次的赋值
变量的真实值取决于它所引用变量的最后一次有效值
- 赋值符 :=
就表示直接赋值,赋予当前位置的值
- 赋值符 ?=
表示如果变量没有被赋值,就赋值等号后的内容,否则仍然是之前赋值的内容
- 变量追加 +=
Makefile中的变量是字符串,+=就可以向变量中追加赋值
三、Makefile模式规则
%就是通配符
%.c:%.o
gcc -c $<
- 自动化变量
$@
表示目标集,“集”的意思就是组合,全部,有多个目标,$@就是目标集合。
$^
所有依赖目标的集合,注意,这里说的是“依赖”,也就是目标的组成元素。
$<
依赖目标中的第一个目标名字,也就是上面说的$^中的第一个元素。
- 伪目标
- 不管当前文件夹有没有与伪目标重名的文件,都会执行伪目标
标签:文件,Makefile,calcu,目标,---,014,input,main From: https://www.cnblogs.com/xlscn/p/17584359.html