单个调用具有多个目标的Makefile规则

单个调用具有多个目标的Makefile规则,makefile,target,Makefile,Target,根据,如果一条规则通过一次调用生成多个目标(例如,使用配方执行具有多个输出文件的工具),则可以使用“&:”规则语法告诉make。 但是,当在多个规则中有多个(但唯一)目标时,使用此语法时,我会收到关于目标“&”的警告。好像在目标名称中使用了符号而不是目标先决条件分隔符的一部分 在我最初的项目中,我有两个规则,它们有多个目标,还有一个从单个语句/工具生成这些目标的配方。这两条规则的目标都是唯一的。我创建了以下简单示例来演示make生成的警告: all: file_abbc .PHONY: all

根据,如果一条规则通过一次调用生成多个目标(例如,使用配方执行具有多个输出文件的工具),则可以使用“&:”规则语法告诉make。 但是,当在多个规则中有多个(但唯一)目标时,使用此语法时,我会收到关于目标“&”的警告。好像在目标名称中使用了符号而不是目标先决条件分隔符的一部分

在我最初的项目中,我有两个规则,它们有多个目标,还有一个从单个语句/工具生成这些目标的配方。这两条规则的目标都是唯一的。我创建了以下简单示例来演示make生成的警告:

all: file_abbc

.PHONY: all clean

clean:
    del /Q file_*

file_abbc: file_ab file_bc
    copy file_ab+file_bc file_abbc

file_ab file_bc &: file_a file_b file_c
    copy file_a+file_b file_ab
    copy file_b+file_c file_bc

file_a file_b file_c &: content
    copy content file_a
    copy content file_b
    copy content file_c
在上面的Windows上运行make时发出的警告:

Makefile:17:警告:覆盖目标“&”的配方

Makefile:13:警告:忽略目标“&”的旧配方


为什么make抱怨目标“&”?

您使用的是GNU make的旧版本,它不理解
&:
规则,所以只将
&
视为文件名。使用
make--version
查看您正在运行的版本,如果该版本比4.3版本旧,则升级。您使用的GNU make的旧版本不理解
&:
规则,因此只需将
&
视为文件名。使用
make--version
查看您正在运行的版本,如果该版本早于4,则进行升级。3@ChrisDodd那很有用。我试了3.81和4.2.90,结果都一样。事实上,我想知道为什么make文档没有说明每个特性的最低版本,但是我现在看到我链接到的文档是针对4.3的。不过,很多系统的默认版本都比较少。很不幸,我在两周前发现了“&:”功能,它是在3周前在Make4.3中发布的。。难怪我已有的make版本不支持它。如果这个示例遵循真实的Makefile,那么就不需要
&:
。每个语句都可以在单独的规则中生成,因为没有一条语句可以生成多个文件。@raspy true。我真正的Makefile使用了两个工具,它们从一个配方语句生成多个目标,这是我在问题的第一句中试图说的。我会修改的更清楚。谢谢!我遇到了同样的问题,这个问题解决了。