我写了这个Makefile。
.PHONY: all clean test
all: my_grep
clean:
-rm my_grep *.o
test:
~/grep_tests/beta.sh
my_grep: main.o line.o input.o
gcc -o my_grep main.o line.o input.o
main.o: main.c input.h line.h
line.o: line.c line.h
input.o: input.c input.h
当我在终端机上写下以下命令时
make line.o
我得到了这样的信息:"为什么Makefile知道怎么做?
cc -c -o line.o line.c
为什么Makefile会知道该怎么做呢?
line.o: line.c line.h
所以我以为什么都不会发生,有什么解释吗?
make
自动提供了一组规则,即使在没有Makefile的情况下也是可用的。 POSIX的规范是 make
称它们为 "默认规则",并 GNU make
文件 称它们为 "内置规则"。 这些规则是后缀规则或实质上等同的模式规则,它们将目标与前提条件相匹配,并根据文件名后缀指定构建配方,因此适用于许多情况。
此外,您需要了解一个 make
规则,但没有配方,并不表示任何地方都没有目标的配方。 相反,这种 "仅有先决条件 "的规则为目标指定了一个非排他性的先决条件列表,而没有提到构建目标的配方。 这允许我们使用多个规则来指定目标的先决条件,只要不超过一个显式规则为目标定义一个配方。特别是,它允许我们为那些由默认内置规则提供配方的目标定义额外的先决条件。
在 GNU 的默认规则中 make
和基本上每一个符合POSIX的 make
的实施,是一个用于建设 .o
文件从相应 .c
文件,而这个规则就是本例中提供配方的规则。 GNU为此提供了一个与此相当的模式规则。
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
这与POSIX规范略有不同,它省略了以下内容: $(CPPFLAGS)
为此从其默认规则中删除,尽管这对所提问题的目的来说并不重要。