c - 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
所以我预计什么都不会发生。有什么解释吗?
解决方案
make
自动提供一组始终可用的规则,即使根本没有 Makefile。 POSIX 规范make
称它们为“默认规则”,GNUmake
文档称它们为“内置规则”。这些是后缀规则或基本等效的模式规则,它们将目标与先决条件相匹配,并根据文件名后缀指定构建配方,因此适用于许多情况。
此外,您需要了解make
没有配方的规则并不表示任何地方都没有任何目标的配方。相反,这样的“仅先决条件”规则为目标指定了一个非排他的先决条件列表,而不涉及构建目标的配方。这允许使用多个规则来指定目标的先决条件,前提是不超过一个显式规则定义目标的配方。特别是,它允许为默认/内置规则提供配方的目标定义额外的先决条件。
在 GNU 的默认规则中make
,基本上每个符合 POSIX 的make
实现都是用于.o
从相应.c
文件构建文件的规则,并且该规则是在这种情况下提供配方的规则。GNU 为此目的提供了一个与此等效的模式规则:
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
这与 POSIX 规范略有不同,POSIX 规范省略$(CPPFLAGS)
了为此目的的默认规则,尽管这对于提出的问题而言无关紧要。
推荐阅读
- python - 我可以做些什么来修复我的简单电脑玩家游戏代码?语法错误
- automation - 无法通过 id 找到控件。SAP GUI 错误?
- vue.js - mocha-webpack - dom 没有更新
- google-apps-script - GS自动前进
- java - 寻求帮助创建 15 分钟的约会,目前硬编码为 1 小时
- r - R: Error in parLapply - $ invalid for atomic vectors only occurs running in parallel
- node.js - How to update a key of object with value in json column with knexjs?
- oracle - What does '%TYPE' mean following a parameter in procedure?
- phpunit - 如何断言数组包含与预期正则表达式匹配的元素?
- css - 设置 div 背景图像不透明度