我正在学习最近编写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)
怎么回事?
为什么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 文档
这篇文章.