从结果可以看到,test 目标先被构建了,然后才构建 all 目标,因为 test 目标是 all 目标的先决条件。出现这种目标依赖关系时, make 会从左到右(在同一规则中)和从上到下(在不同的规则中)的先后顺序先构建一个规则所依赖的每一个目标,形成一种“链式反应”。
二、 搭建基本的编译环境(实验)
我们把这个简单的项目称为
simple 项目吧,让我们先编辑项目中用到的几个文件
(1)foo.c
#include <stdio.h>
void foo()
{
printf("foo() function test makefile");
}
(2) main.c
extern void foo();
int main()
{
foo();
return 0;
}
(3) Makefile
all: main.o foo.o
gcc -o simple main.o foo.o
main.o: main.c
gcc -o main.o -c main.c
foo.o: foo.c
gcc -o foo.o -c foo.c
clean:
rm main.o foo.o
执行方法很简单,键入 make 命令就会生成相应文件,键入 make clean 命令就会删除相应文件。注意连续几次(大于两次)键入 make 命令,从第二次开始,就没有构建目标文件的动作,但是有构建 simple 可执行程序的动作。这是因为 make 是通过文件的时间戳来判定哪些文件需要重新编译的。make 在分析一个规则以创建目标时,如果发现先决条件中文件的时间戳大于目标的时间戳,那先决条件中的文件比目标更新,就没必要再重新构建了。