Makefile 介绍:
Makefile 是一种配置文件,它可以指定工程中的源文件的编译顺序、重新编译哪些文件以及执行更复杂的操作
就像一个Shell脚本,可以执行操作系统的命令
Makefile 可以更有效率地管理工程中的源文件,提高工作效率
Makefile 的基本书写规则:
1 | target(目标)... : prerequisites(依赖)... |
- 目标 (Target)
- 通常是需要生成的文件名(如
app.exe,main.o) - 也可以是伪目标(执行操作而非生成文件,如
clean)
- 通常是需要生成的文件名(如
- 依赖 (Prerequisites)
- 生成目标所需的文件或其他目标(用空格分隔)
- 当依赖比目标更新时,命令会被执行
- 命令 (Command)
- 生成目标的具体操作指令(必须用 Tab 缩进,不能用空格)
- 每条命令在独立的 Shell 中执行,失败则终止构建

make 执行的条件:
make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序
默认提供的 makefile 文件有三类名称: “GNUmakefile”、“makefile” 和 “Makefile”(GNU make 找寻默认的 Makefile 的顺序)
指令的隐藏 @:
在指令前加符号 @ 可以在终端上隐藏指令,不会在终端上显示出来

make 运行其他目标:
- makefile 文件可以有多个目标,但是只会执行第一个目标
- 在 make 指令后追加目标名称即可执行其他目标
1 | MyTarget: |
- 终端执行的时候:make MyCmd 指定名称,就会执行MyCmd
清空目标规则:(clean)
1 | clean: |
变量规则:
变量的定义与引用:
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 “$” 符号,但最好用小括号()或是大括号 {} 把变量给包括起来
如果要使用真实的 “$” 字符,需要用 “$$” 来表示
变量可以应用在目标、依赖、指令
1
2a=123
b=$(a) #引用 a 给到 b
递归赋值 = :
在 “=” 左侧是变量,右侧是变量的值
右侧变量的值可以定义在文件的任何一处,也就是说, 右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值
1
2
3
4
5a=123
b=$(a)
a=456
val:
echo $(a) #a 的值变成 456
赋值 := :
- := 相当于C语言的 =
查询赋值 ?= :
- 例如: Temp ?= Val
- 执行代码时,查询 Temp 变量是否被定义过?
- 如果 Temp 没有被定义过,那么变量 Temp 的值就是“Val”
- 如果 Temp 先前被定义过,那么这条语将什么也不做
- 注意:赋值方式是递归赋值
替换赋值 $(val:a=b)
格式是 “$(var:a=b)” 或 “${var:a=b}”
1
2foo := a.1o b.o c.o
bar := $(foo:.o=.c) #foo里面的 .o 被替换为 .c
变量的多层引用:
类似于 shell ${!Value}, makefile 中的格式为 $($(Value))
1
2
3Temp = 2025
Value = Temp
echo $($(Value)) #输出结果2025
追加赋值 += :
1
2
3Temp=1.c 2.c
Temp+=3.c
现在 Temp 等于 1.c 2.c 3.c特殊变量:

指定目标与伪目标:
- all 这个伪目标是所有目标的目标,其功能一般是编译所有的目标
- clean 这个伪目标功能是删除所有被 make 创建的文件
- install 这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去
- print 这个伪目标的功能是例出改变过的源文件
- tar 这个伪目标功能是把源程序打包备份。也就是一个tar文件
- dist 这个伪目标功能是创建一个压缩文件,一般是把tar文件压成 Z 文件或是 gz 文件
- TAGS 这个伪目标功能是更新所有的目标,以备完整地重编译使用
- check 和 test 这两个伪目标一般用来测试 makefile 的流程
1 | .PHONY:all |
- 执行 make 会把Target1 Target2 Target3全部执行