一、makefile概述
makefile可以对整个工程项目文件进行管理,进行自动化编译,一旦写好只需要一个 make 命令,整个工
程完全自动编译。
二、makefile基本原则
基本规则中的三要素: 目标, 依赖, 命令
目标:依赖条件
命令(此行为一个TAB缩进)
规则示例:
mycalc:add.c sub.c mul.c div.c
gcc add.c sub.c mul.c div.c -o mycalc(此行为一个TAB缩进)
三、makefile语法
1.变量的定义:
obj=main.o add.o sub.o mul.o(变量的定义)
target=app(变量的定义)
#递归展开式
#延时变量,可以引用还没有定义的变量,展开是引用时展开,即值使用到时才确定
str2=$(str1)
str1=hello
#直接展开式
#即时变量,必须引用定义好了的变量,定义之后就会展开,即值即刻确定,在定义时即确定
str3 := android
str4 := $(str3)
str5 := $(str1) world
#变量的值追加,它是即时变量还是延时变量取决于前面的定义
str5 += hello
2.自动化变量
2.1 $<: 规则中的第一个依赖
2.2 $^: 规则中的所有依赖
2. 3 $@: 规则中的目标
只能在规则中的命令中使用
3. 模式匹配规则
%.o:%.c
gcc -c $< -o $@
4. 两个常用系统函数
4.1 查找指定目录下, 指定类型的文件
src=$(wildcard ~/aa/*.c)
4.2 匹配替换函数
obj=$(patsubst %.c, %.o, $(src))
5.自定义函数
myfun=$2 $1
#变量等于函数的执行结构
myfun_ret=$(call myfun,20,10)
四、makefile的三种写法(由简单到复杂)
第一种写法:
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
第二种写法:
app:main.o add.o sub.o mul.o
gcc main.o add.o sub.o mul.o -o app
main.o:main.c
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
mul.o:mul.c
gcc -c mul.c -o mul.o
sub.o:sub.c
gcc -c sub.c -o sub.o
第三种写法:
obj=main.o add.o sub.o mul.o
target=app
#makefile中自己维护的变量(makefile代码里面的注释用#)
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
#clean清除所有的.o中间文件
#伪目标
.PHONY:clean
clean:
rm -f *.o
rm -f app
五、makefile的使用
1.写好makefile文件后使用make命令即可对整个工程项目进行编译链接。
2.用make clean 来显式调用makefile文件中的clean目标
3.makefile第一条规则是用来生成终极目标的规则
- 如果规则中的依赖不存在, 向下寻找其他的规则
- 更新机制: 比较的是目标文件和依赖文件的时间
六、makefile总结
1. 一个基本规则
1.1 三要素: 目标, 依赖, 命令
目标:依赖
命令
1. 2 第一条规则是用来生成终极目标的规则
- 如果规则中的依赖不存在, 向下寻找其他的规则
- 更新机制: 比较的是目标文件和依赖文件的时间
2. 两个函数
2.1 查找指定目录下, 指定类型的文件
src=$(wildcard ~/aa/*.c)
2.2 匹配替换函数
obj=$(patsubst %.c, %.o, $(src))
3. 三个自动变量
3.1 $<: 规则中的第一个依赖
3.2 $^: 规则中的所有依赖
3. 3 $@: 规则中的目标
只能在规则中的命令中使用
4. 模式规则
%.o:%.c
gcc -c $< -o $@