Gcc 关于Makefile的问题-什么是$+&引用&;此处调用的.c文件/依赖项在哪里?

Gcc 关于Makefile的问题-什么是$+&引用&;此处调用的.c文件/依赖项在哪里?,gcc,makefile,dependencies,gnu-make,Gcc,Makefile,Dependencies,Gnu Make,我偶然发现了这个Makefile(通过一个名为sendip的开源项目找到的) 关于这个文件,我有两个困惑- 此处指定为依赖项的.c文件在哪里?虽然所有像ipv6.so,tcp.so这样的库都生成得很好,但是这里哪一行负责呢 我想这是一条线。。。。。对吧 %.so: %.c $(LIBS) $(CC) -o $@ $(CFLAGS) $(LIBCFLAGS) $+ $(LIBS) 但是$(LIBS)只指定一些.o文件。这是$+在做什么吗 2.我从未听说过$

我偶然发现了这个Makefile(通过一个名为sendip的开源项目找到的)

关于这个文件,我有两个困惑-

  • 此处指定为依赖项的
    .c
    文件在哪里?虽然所有像
    ipv6.so
    tcp.so
    这样的库都生成得很好,但是这里哪一行负责呢
  • 我想这是一条线。。。。。对吧

    %.so: %.c $(LIBS)
                        $(CC) -o $@ $(CFLAGS) $(LIBCFLAGS) $+ $(LIBS)
    
    但是
    $(LIBS)
    只指定一些.o文件。这是
    $+
    在做什么吗


    2.我从未听说过
    $+
    。我试图找到它,并遇到了许多其他的问题,如
    $?
    $@
    $其中一些是GNU Make(也称为“gmake”)的扩展:

    • 变量定义解析如下:

       immediate = deferred
       immediate ?= deferred
       immediate := immediate
       immediate += deferred or immediate
      
    GNU make的工作分为两个不同的阶段。第一阶段, 它读取所有的makefile,包括makefile等,并将其内部化 所有变量及其值、隐式和显式规则,以及 构造所有目标及其目标的依赖关系图 先决条件。在第二阶段,使用这些内部 结构,以确定需要重建的目标以及 调用执行此操作所需的规则

    。。。我们说,如果扩张发生在第一阶段,那么扩张是立竿见影的 阶段:在这种情况下,make将扩展中的任何变量或函数 作为makefile的构造部分被解析。我们说 如果不立即执行扩展,则扩展将被延迟。 延迟构造的扩展直到 构造稍后出现在即时上下文中,或直到第二个 阶段

    是的,你说得对

    当目标定义以
    %
    字符开头时,它定义的是目标模式,而不是特定模式。So
    %.So
    表示生成其他目标所需或用户所需的所有.So文件的目标。
    %.c
    也是一种模式,表示所有
    .c
    文件

    因此,
    $(CC)-o$@$(CFLAGS)$(LIBCFLAGS)$+$(LIBS)
    意味着命令输出将具有正在生成的目标的名称($@->与模式匹配的目标的名称)。。。
    $+
    表示与
    先决条件
    模式匹配的所有文件(即:
    %.c

    请查看GNU make手册,特别是在,以了解什么是
    $+
    $^
    。。。意思是

     immediate = deferred
     immediate ?= deferred
     immediate := immediate
     immediate += deferred or immediate