一、本节概要
本专栏所有内容围绕Makefile官方文档进行刨析,给出详细具体示例做辅助理解手撕Makefile官方手册
二、Makefile中的目标和依赖
在一个简单的Makefile中,每条规则通常由以下几个部分组成:
target ... : prerequisites ...
recipe
...
...
- 目标(target)通常是由程序生成的文件的名称,例如可执行文件或目标文件。目标也可以是要执行的操作的名称,比如 ‘clean’。
- 先决条件(prerequisites)是用于创建目标的输入文件。目标通常依赖于多个文件,这些文件被视为先决条件。
在规则的最后,可以包含一个或多个命令行指令(recipe),用于生成目标文件。这些指令可以是任何Shell命令,用于描述如何从先决条件生成目标文件。
因此,Makefile中的规则描述了目标文件如何依赖于先决条件,并提供了生成目标文件的步骤(recipe)。当某个目标的先决条件发生变化时,Make工具会根据规则中定义的步骤重新生成该目标文件。
三、辅助理解示例
以下是一个简单的示例Makefile:
# 目标: main
# 先决条件: main.c utils.c
# 生成可执行文件 main
main: main.o utils.o
gcc -o main main.o utils.o
# 目标: main.o
# 先决条件: main.c
# 生成目标文件 main.o
main.o: main.c
gcc -c -o main.o main.c
# 目标: utils.o
# 先决条件: utils.c
# 生成目标文件 utils.o
utils.o: utils.c
gcc -c -o utils.o utils.c
# 清理生成的目标文件和可执行文件
clean:
rm -f main main.o utils.o
在这个示例中,有三个规则。第一个规则定义了目标为main
,它的先决条件为main.o
和utils.o
。生成目标的步骤是通过gcc
编译器将main.o
和utils.o
链接为可执行文件main
。
第二个规则定义了目标为main.o
,它的先决条件是main.c
。生成目标的步骤是通过gcc
编译器将main.c
编译为目标文件main.o
。
第三个规则定义了目标为utils.o
,它的先决条件是utils.c
。生成目标的步骤是通过gcc
编译器将utils.c
编译为目标文件utils.o
。
最后,还定义了一个名为clean
的伪目标,用于删除生成的目标文件和可执行文件。通过执行make clean
命令,可以调用rm
命令删除main
、main.o
和utils.o
。