为什么makefile会在没有任何特定规则的情况下自动生成目标文件(*.o)?

Hao*_* Li 4 c makefile

我正在学习最近编写makefile.我正在阅读的所有文件都告诉我,我必须编写一条规则来执行命令.但我发现以下Makefile可以生成没有任何编译命令的目标文件.为什么?

SOURCES=$(wildcard  src/*.c)
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))

all: $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

当我在终端输入make时,我得到了这个:

cc -c -o xxx.o xxx.c
Run Code Online (Sandbox Code Playgroud)

怎么回事?

ter*_*ill 6

为什么makefile会在没有任何特定规则的情况下自动生成目标文件(*.o)?

因为它有一套内置规则.


使用隐式规则,如下所示:

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

%: %.o    
    $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
Run Code Online (Sandbox Code Playgroud)

你可以看到所有这些make -p.同时make -d显示应用的规则.

正如Ian Abbott在评论中指出的那样:

make -p 需要从没有makefile的目录运行(没有Makefile,也没有GNUmakefile).

另请参阅相关的GNU make 文档

这篇文章.