Gcc 关于Makefile的问题-什么是$+&引用&;此处调用的.c文件/依赖项在哪里?
我偶然发现了这个Makefile(通过一个名为sendip的开源项目找到的) 关于这个文件,我有两个困惑-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.我从未听说过$
.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