首页 > 解决方案 > makefile 默认行为,无命令

问题描述

我写了这个 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

我收到这条消息:

cc    -c -o line.o line.c

Makefile 怎么知道该怎么做?行后没有说明:

line.o: line.c line.h

所以我预计什么都不会发生。有什么解释吗?

标签: cmakefile

解决方案


make自动提供一组始终可用的规则,即使根本没有 Makefile。 POSIX 规范make称它们为“默认规则”,GNUmake文档称它们为“内置规则”。这些是后缀规则或基本等效的模式规则,它们将目标与先决条件相匹配,并根据文件名后缀指定构建配方,因此适用于许多情况。

此外,您需要了解make没有配方的规则并不表示任何地方都没有任何目标的配方。相反,这样的“仅先决条件”规则为目标指定了一个非排他的先决条件列表,而不涉及构建目标的配方。这允许使用多个规则来指定目标的先决条件,前提是不超过一个显式规则定义目标的配方。特别是,它允许为默认/内置规则提供配方的目标定义额外的先决条件。

在 GNU 的默认规则中make,基本上每个符合 POSIX 的make实现都是用于.o从相应.c文件构建文件的规则,并且该规则是在这种情况下提供配方的规则。GNU 为此目的提供了一个与此等效的模式规则:

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

这与 POSIX 规范略有不同,POSIX 规范省略$(CPPFLAGS)了为此目的的默认规则,尽管这对于提出的问题而言无关紧要。


推荐阅读