makefile 2023-06-15
2023-06-14 本文已影响0人
9_SooHyun
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 的 构建
- 注意:如果Commands执行完毕后不生成Target,那么每次 make 该 Target 时,都会重新执行Commands(因为目标文件不存在)。我们把这类target称为“伪目标”。即:每一次make都会重新构建“伪目标”。
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
一些约定的变量:
$@
:编译目标
$<
:依赖列表中的第一个依赖对象
$^
:依赖列表中的所有对象
$?
:依赖文件列表中所有有更新的文件