3.1.1. 目标:依赖 (tab)命令............................................................................ 3
3.1.2. Makefile会把规则中的第一个目标作为终极目标................................... 4
4.1. 若想生成目标,检查规则中的依赖条件是否存在, 如果不存在,寻找是否有规则用来生成该依赖文件 4
4.2.1. 依赖文件比目标文件时间晚,则需要更新............................................... 4
5.1. make --> 通过makefile生成目标文件............................................................. 4
5.1.1. 直接 make (使用makefile文件).......................................................... 4
5.1.2. make -f mm (指定一个名字不为makefile的文件)................................... 4
5.2. make clean --> 清除编译生成的中间.o文件和最终目标文件........................ 4
5.2.1. 如果当前目录下有同名clean文件,则不执行clean对应的命令......... 4
6.1.1. 变量定义及赋值:obj = a.o b.oc.o............................................................. 5
6.1.3. 由 Makefile 维护的一些变量.................................................................... 5
7.1. makefile中所有的函数必须都有返回值........................................................... 6
7.2.1. 查找指定目录下指定类型的文件,一个参数........................................... 6
1. 文件的命名规则
1.1. Makefile
1.2. makefile
2. 用途
2.1. 项目代码编译管理
2.2. 节省编译项目的时间
2.3. 一次编写终身受益
3. 基本规则
3.1.
3.1.1. 目标:依赖
(tab)命令
目标 --> 要生成的目标文件
伪目标
依赖 --> 生成目标文件需要的一些文件
命令 --> 借助依赖文件生成目标文件的手段
忽略错误命令继续执行
不显示执行时候的命令细节
tab --> 缩进,有且只有一个
3.1.2. Makefile会把规则中的第一个目标作为终极目标
all:app -->all指定生成的最终目标为app
4. 工作原理
4.1. 若想生成目标,检查规则中的依赖条件是否存在,
如果不存在,寻找是否有规则用来生成该依赖文件
4.2. 检查规则中的目标是否需要更新,必须检查它的所有依赖,
依赖中有任意一个被更新,则目标必须更新
4.2.1. 依赖文件比目标文件时间晚,则需要更新
5. 执行
5.1. make --> 通过makefile生成目标文件
5.1.1. 直接 make (使用makefile文件)
5.1.2. make -f mm (指定一个名字不为makefile的文件)
5.2. make clean --> 清除编译生成的中间.o文件和最终目标文件
5.2.1. 如果当前目录下有同名clean文件,则不执行clean对应的命令
解决方案 --> 伪目标声明:.PHONY:clean
5.2.2. 特殊符号
- :表示此条命令出错,make也会继续执行后续的命令。如:“-rm a.o b.o”
6. 变量
6.1. 普通变量
6.1.1. 变量定义及赋值:obj = a.o b.o c.o
6.1.2. 变量取值:foo = $(obj)
6.1.3. 由 Makefile 维护的一些变量
通常格式都是大写
CC:默认值 cc
有些有默认值,有些没有
CPPFLAGS : 预处理器需要的选项 如:-I
CFLAGS:编译的时候使用的参数 –Wall –g -c
LDFLAGS :链接库使用的选项 –L -l
用户可以修改这些变量的默认值
CC = gcc
6.2. 自动变量
6.2.1. 变量
$@ --> 规则中的目标
$< --> 规则中的第一个依赖条件
$^ --> 规则中的所有依赖条件
6.2.2. 模式规则
在规则的目标定义中使用 %
在规则的依赖条件中使用 %
示例:
%.o:%.c
$(CC) –c $< -o $@
$< --> 表示依次取出依赖条件
$@ --> 表示依次取出目标值
7. 函数
7.1. makefile中所有的函数必须都有返回值
7.2. wildcard
7.2.1. 查找指定目录下指定类型的文件,一个参数
7.2.2. src = $(wildcard ./src/*.c)
找到./src 目录下所有后缀为.c的文件,赋给变量src
7.3. patsubst
7.3.1. 匹配替换,从src中找到所有.c 结尾的文件,并将其替换为.o
7.3.2. obj = $(patsubst %.c ,%.o ,$(src))
把src变量中所有后缀为.c的文件替换成.o
7.3.3. ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))
指定.o 文件存放的路径 ./obj/%.o