【makefile学习记录2】初识makefile结构

1、makefile的意义及定义:

用于定义源文件间的依赖关系(通过自己特定的语法),通过这种依赖关系来说明如何编译各个源文件并生成可执行文件。

依赖的定义:(①定义依赖规则时,依赖条件可以省略②可以把command1不用,此时分号可去掉)

targets : prerequisite ; command1
'\t' command2

makefile中的元素含义:

  •  targets:   

  1.  通常是需要生成的目标文件名
  2. make所需执行的命令名称

  •  prerequisites:

  1. 当前目标所依赖的其他目标或文件

  •  command:

  1. 完成目标所需要执行的命令

规则中的注意事项:

  1. targets可以包含多个目标,使用空格对多个目标进行分隔
  2. prerequisite可以包含多个依赖,使用空格对多个依赖进行分隔
  3. 【Tab】键:'\t'      每一个命令行必须以【Tab】字符开始,【Tab】字符告诉make此行是命令行
  4.  续行符:\           可以将内容分开写到下一行,提高可读性

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之间的依赖关系并没有发生变化,所以不执行。


猜你喜欢

转载自blog.csdn.net/haibing_x/article/details/79868244