1、makefile的意义及定义:
用于定义源文件间的依赖关系(通过自己特定的语法),通过这种依赖关系来说明如何编译各个源文件并生成可执行文件。
依赖的定义:(①定义依赖规则时,依赖条件可以省略②可以把command1不用,此时分号可去掉)
targets : prerequisite ; command1
'\t' command2
makefile中的元素含义:
- targets:
- 通常是需要生成的目标文件名
- make所需执行的命令名称
- prerequisites:
- 当前目标所依赖的其他目标或文件
- command:
- 完成目标所需要执行的命令
规则中的注意事项:
- targets可以包含多个目标,使用空格对多个目标进行分隔
- prerequisite可以包含多个依赖,使用空格对多个依赖进行分隔
- 【Tab】键:'\t' 每一个命令行必须以【Tab】字符开始,【Tab】字符告诉make此行是命令行
- 续行符:\ 可以将内容分开写到下一行,提高可读性
2、一个makefile的依赖示例
本例中,目标all以来条件为目标test。
所对应的依赖关系为:
程序运行结果为:
若想要将 echo "make all"此类命令变成无回显字符,则在命令前加上(两者之间无空格)"@"符号:(这是一个小技巧)
运行结果为:
依赖规则:
- 当目标所对应的文件埠村子啊,执行对应命令;
- 当依赖在时间上比目标更(四声)新,执行对应命令;
- 当依赖关系连续发生时,对比依赖链上的每一个目标。
比如:有.c源文件,.o二进制文件及可执行程序时,此时,.c是.o的依赖,.o是可执行程序的依赖。当各自的依赖发生改变时,执行目标对应的命令。当不发生改变时,运行make时也不执行相应命令。
3、第一个make的编译案例
makefile为:
即可知道如下图所示的依赖关系:
fun.c文件为:
main.c文件为:
运行make:
可以看到所对应的命令,并且生成hello.out可执行文件。
再次运行make,提示hello.out已经是最新的了,不执行命令。执行hello.out时,是一样的效果。但是当运行make all 时,执行所对应的命令,因为 all 是一个目标,但不是一个文件,所以会去执行。
当改变fun.c文件内容时,执行make。发现只有所改变的才会重新执行,main.o和main.c之间的依赖关系并没有发生变化,所以不执行。