Makefile的编写
Makefile的编写
Makefile的命名
- Makefile
- makefile
Makefile的规则
规则中的三要素:目标,依赖,命令
- 目标:依赖条件
- 缩进 命令
Makefile学习
vim makefile
app:main.c add.c sub.c mul.cgcc main.c add.c sub.c mul.c -o app
:wq
make2. ```makefile 第二个版本 没有改变的代码文件则不需要编译,对命令拆分,分开编译 首先去找依赖,如果在当前目录(或指定目录)找不到依赖文件,则向下查找对应依赖规则,执行命令,最后找到所有依赖,在执行生成最终目标(可执行文件)的命令 app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o app main:main.o gcc -c main.c add.o:add.c gcc -c add.c mul.o:mul.c gcc -c mul.c sub.0:sub.c gcc -c sub.c
Makefile工作原理
首先查找依赖
- 没有则生成
依赖文件的时间比较
- xx.o和xx.c的时间 xx.o的时间肯定要比xx.c要新 如果xx.c的时间比xx.o要新
- 说明文件修改过则重新运行gcc -c xx.c命令
生成最终目标的时候也是比较时间
- 可执行文件和各个依赖进行比较,依赖时间比app要新
- 说明可执行文件不是最新的,则需要执行生成可执行文件的命令
- 通过这种对比时间,只make新修改的文件,会大大提高程序编译的效率
obj、targer自定义变量
%.o:%.c 模式自动匹配
$< 规则中的第一个依赖xx.o
$@ 规则中的目标appobj=main.o add.o sub.o mul.o
target=app
$(target):$(obj)CC $(obj) -o $(target)
%.o:%.c
CC -c $< -o $@
5. ```makefile target=app src=$(wildcard ./*.c) obj=$(patsubst ./%.c, ./%.o, $(src)) $(target):$(obj) $(CC) $(obj) -o $(target) %.o:%.c $(CC) -c $< -o $@ .PHONY:clean clean: rm $(obj) $(target) -f
Makefile的两个函数
- src=$(wildcard ./*.c) 会将指定目录下所有的.c文件名获取
- obj=$(patsubst ./%.c, ./%.o, $(src)) 会将所有.c文件替换成.o文件 .c文件从$(src)获取
- .PHONY:clean 伪目标 使用这个可以防止当前目录下有clean文件,与其对比,上面makefile中写的clean没有生成目标,根据对比之前所说的更新规则,每次比较当前目录中的clean都是最新的
- 在命令前加上- 如果失败忽略掉这条 则继续执行
Makefile的三个自动变量
- $<: 规则中的第一个依赖
- $@: 规则中的目标
- ¥^: 规则中的所有依赖
- 只能在规则的命令中使用
makefile 中自己维护的变量 一般大写
- CC gcc
- CPPFLAGS 预编译处理器需要的选项 如: -I
- CFLAGS 编译的时候使用的参数 -Wall -g -c
- LDFLAGS 链接库使用的选项 -L -l