Gcc 是什么调用了这个模式匹配规则?

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) $

我有一个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)
$(CC)-o$@$<
我知道前3行是本地定义,当我键入“Make”时,它将构建
all
目标。现在我有点迷路了。。。我猜:

  • Make看到
    $(可执行文件)
    标签并跳转该生成命令
  • 它会看到
    $(OBJS)
    标签,由于
    a.o
    在本地目录中不存在,它会跳转到模式匹配规则
  • Make查找
    a.c
    并运行规则生成
    a.o
  • 现在返回到
    $(可执行)
    命令,并运行.o文件的组合以生成“hello”程序
  • 问题:

  • 我对这个流程的理解正确吗
  • 该文件中“标签”的位置是否相关
  • 是否有一些我丢失的GNU文档证实了我对其工作原理的怀疑

  • 你的流程基本上是正确的。如果没有在命令行上显式传递目标,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)