我正在学习最近编写makefile。我正在阅读的所有文件都告诉我,我必须编写一条规则来执行命令。 但我发现以下Makefile可以生成没有任何编译命令的目标文件。为什么呢?
SOURCES=$(wildcard src/*.c)
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))
all: $(OBJECTS)
当我在终端输入make时,我得到了这个:
cc -c -o xxx.o xxx.c
怎么回事?
答案 0 :(得分:5)
为什么makefile会在没有任何内容的情况下自动生成目标文件(* .o) 具体规则?
因为它有一套内置规则。
使用隐含规则,如下所示:
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c
%: %.o
$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
您可以使用make -p
查看所有这些内容。虽然make -d
显示了已应用的规则。
正如Ian Abbott在评论中指出的那样:
make -p
需要从没有makefile的目录运行(和 没有Makefile,也没有GNUmake文件。)
另请参阅相关的GNU make documentation
和post。