Gcc 是什么调用了这个模式匹配规则?
我有一个Makefile,它似乎在工作,但我不确定如何:Gcc 是什么调用了这个模式匹配规则?,gcc,makefile,pattern-matching,Gcc,Makefile,Pattern Matching,我有一个Makefile,它似乎在工作,但我不确定如何: EXECUTABLE=hello CC=gcc OBJS = a.o all: $(EXECUTABLE) %.o : %.c $(CC) -o $@ -c $< $(EXECUTABLE): $(OBJS) $(CC) -o $@ $< EXECUTABLE=hello CC=gcc OBJS=a.o 全部:$(可执行) %.o:%.c $(CC)-o$@-c$< $(可执行文件):$(OBJS) $
EXECUTABLE=hello
CC=gcc
OBJS = a.o
all: $(EXECUTABLE)
%.o : %.c
$(CC) -o $@ -c $<
$(EXECUTABLE): $(OBJS)
$(CC) -o $@ $<
EXECUTABLE=hello
CC=gcc
OBJS=a.o
全部:$(可执行)
%.o:%.c
$(CC)-o$@-c$<
$(可执行文件):$(OBJS)
$(CC)-o$@$<
我知道前3行是本地定义,当我键入“Make”时,它将构建all
目标。现在我有点迷路了。。。我猜:
$(可执行文件)
标签并跳转该生成命令$(OBJS)
标签,由于a.o
在本地目录中不存在,它会跳转到模式匹配规则a.c
并运行规则生成a.o
$(可执行)
命令,并运行.o文件的组合以生成“hello”程序你的流程基本上是正确的。如果没有在命令行上显式传递目标,Make将生成文件中列出的第一个目标。在大多数makefiles中,人们将
all
作为第一个目标,因此就像在您的示例中一样,您只需键入make
,它就会自动构建all
目标。make在内部做的是构建一个在Makefile中定义的依赖项列表<代码>所有都依赖于$(可执行)
,后者依赖于$(OBJS)
。为了满足创建all
目标的需要,它必须从依赖项列表的底部开始,然后逐步向上。如果你想看一下这里,制作手册实际上是非常好的:特别是你在这里的具体问题:我找到了一个工具来帮助回答我问题的一部分,所以我将发布它供我自己和其他人参考:
可以通过$(警告)
调用“调试”Makefile
因此,在我的示例中,我将其用作:
all: $(warning All before exe call) $(EXECUTABLE)
$(warning All warning after call)
%.o : %.c
$(warning before pattern)
$(CC) -o $@ -c $<
$(warning after pattern)
$(EXECUTABLE): $(warning before obj) $(OBJS)
$(warning after obj)
$(CC) -o $@ $<
利用这个,我发现我可以做到:
$(EXECUTABLE): $(warning before obj) $(OBJS)
但不是:
$(EXECUTABLE):
$(warning before obj)
$(OBJS)
这是有道理的,因为空白在Makefiles中很重要感谢您提供的信息。最后一个链接告诉我#3的答案(这是标签的顺序很重要)对吗?它只对不提供make目标的情况很重要,例如它给出的示例“make all”“make clean”等。$(info)是另一个很好的make函数,用于打印信息,例如$(info$(OBJS))@谢谢!我还没有在$info上找到任何内容,是打印通用字符串还是只打印字段?请注意,将
$(警告…
放置在目标的先决条件列表中并不能达到预期效果,因为它在读取makefile时立即进行计算,而不是在考虑目标时。是的$(info可以打印任何内容$(info HELLO here)或$(信息$(OBJS))
$(EXECUTABLE):
$(warning before obj)
$(OBJS)