1.1 make 和makefile
1.1.1 make
make 是一个应用程序
- 解析源程序之间的依赖关系
- 根据依赖关系自动维护编译工作
- 执行宿主操作系统中的各种命令
1.1.2 makefile
makefile是一个描述文件
- 定义一系列的规则类指定源文件编译的先后顺序
- 拥有特定的语法规则,支持函数定义和函数调用
- 能直接集成操作系统中的各种命令
1.1.3 makefile本质
makefile实际就是一个脚本程序,类似于shell脚本。
由于代码块中没有make的,所以用bash来代替make的代码块
1.1.4 案例
make.txt文件内容
hello:
echo "hello makefile"
注意,echo前面是tab键,也就是\t
执行命令 : make -f make.txt hello
1.2 初始makefile的结构
1.2.1 makefile的意义
- makefile 用于定义源文件的依赖关系
- makefile 说明如何编译各个源文件并生成可执行文件
依赖的定义:
target : prerequisites;command1
'\t' command2
1.2.2 makefile 中的元素含义
-
targets
- 通常是需要生成的目标文件名
- make所需执行的命令名称
-
prerequisities:
- 当前目标所以依赖的其他目标或文件
-
command
- 完成目标说需要执行的命令
1.2.3 规则中的注意事项
- target 可以包含多个目标
- 用空格对多个目标进行分割
- prerequisites 可以包含多个依赖
- 用空格对多个依赖进行分割
- [Tab] 键 : ‘\t’
- 每一个命令行必须以[Tab] 字符开始
- [Tab] 字符告诉make此行是一个命令行
- 续行符 : \
- 可以将内容分开写到下一行,提高可读性
1.2.4 make的依赖示例
all : test
echo "make all"
test:
echo "make test"
1.2.5 依赖规则 重要
- 当目标对应的文件不存在,执行对应命令
- 当依赖在时间上比目标更新,执行对应名
- 当依赖关系连续发生时,对比依赖链上的每一个目标
小技巧,makefile中可以在命令前加上@符,作用为命令无回显
1.2.6 makefile 案例
小技巧,工程项目中可以将最终可以执行文件名和all同时作为makefile中第一条规则的目标
hello.out all : main.o func.o
gcc -o hello.out main.o func.o
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
1.3 伪目标的引入
1.3.1 伪目标的语法
- 伪目标的语法:先声明,后使用
- 本质
- 伪目标是 是make中的特殊目标 .PHONY的依赖
.PHONY : clean
.PHONY:clean clean : rm *.o hello.out
- 本质
1.3.2 伪目标的妙用
伪目标的妙用: 规则调用(函数调用)
- 原理: 当一个目标的依赖包含伪目标时,伪目标 定义的命令总是被执行
.PHONY : clean rebuild all
rebuild : clean all
clean :
rm *.o hello.out
1.3.3 技巧
- 技巧 绕开 .PHONY 关键字定义伪目标
- 原理 : 如果一个规则米有命名或者依赖,并且他的目标不是一个存在的文件名,在执行此规则时,目标总会被认为是最新的。
clean : FORCE
rm *.o hello.out
FORCE:
参考一 : 狄泰软件课程
如有侵权:请联系邮箱 1986005934@qq.com