makefile 2023-06-15

Makefile 基本结构

Makefile的基本结构包括三个部分:目标(Target)、依赖(Dependencies)和命令(Commands)

Target:Dependencies
    Commands
  • 目标(Target):指需要生成的文件名。它可以是任意文件,可以是一个对象文件(Object File),也可以是一个可执行文件(Executable File)
  • 依赖(Dependencies):指生成目标文件所依赖的源文件。
    • 如果Makefile同级目录下不存在目标文件,则一定会执行目标编译
    • 如果Makefile同级目录下已经存在目标文件,则对比目标文件和依赖文件的最后更新时间。任一依赖文件比目标文件更新时,执行一次目标编译
  • 命令(Commands):值生成目标文件所需要执行的shell命令。这些命令必须以Tab字符开始。
    • 注意:如果Commands执行完毕后不生成Target,那么每次 make 该 Target 时,都会重新执行Commands(因为目标文件不存在)。我们把这类target称为“伪目标”。即:每一次make都会重新构建“伪目标”。
      伪目标可以直接使用.PHONY声明,如.PHONY : clean表示,clean是一个伪目标,即使Makefile同级目录下存在名为clean目标文件,make clean都将执行一次新的 target 为 clean 的 构建

Makefile 变量

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示

变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中。先看一个例子:

objects = program.o foo.o utils.o
program : $(objects)
    cc -o program $(objects)

$(objects) : defs.h

变量会在使用它的地方精确地展开,就像C/C++中的宏一样,例如:

foo = c
prog.o : prog.$(foo)
    $(foo)$(foo) -$(foo) prog.$(foo)

展开后得到:

prog.o : prog.c
    cc -c prog.c

一些约定的变量:
$@:编译目标
$<:依赖列表中的第一个依赖对象
$^:依赖列表中的所有对象
$?:依赖文件列表中所有有更新的文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 Makefile文件由一系列规则(rules)构成。每条规则的形式如下。 上面第一行冒号前面的部分,叫做"目...
    佩玖吟阅读 1,403评论 0 2
  • 在我写 Makefile 的头 10 年里,我养成了一个非常不好的习惯-- 完全严格使用 GNU Make 的扩展...
    liuchengxu阅读 1,401评论 0 13
  • Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。 tar...
    小y同学hh阅读 561评论 0 0
  • makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程...
    Stan_Z阅读 1,646评论 2 15
  • Makefile书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。 在Makefile中,规则的顺...
    Caiaolun阅读 415评论 0 0