makefile目标依赖项依赖于目标名称

makefile目标依赖项依赖于目标名称,makefile,gnu-make,Makefile,Gnu Make,我有以下规则: SPECIAL = file1 file2 %.o : %.cpp a.h $(CC) -c $(CFLAGS) $< -o $@ SPECIAL=file1 file2 %.o:%.cpp a.h $(CC)-c$(CFLAGS)$

我有以下规则:

SPECIAL = file1 file2

%.o : %.cpp a.h
    $(CC) -c $(CFLAGS) $< -o $@
SPECIAL=file1 file2
%.o:%.cpp a.h
$(CC)-c$(CFLAGS)$<-o$@
我希望如果
%
$(特殊)
中,那么
b.h
被添加到依赖项列表中


有没有一种不重复规则的方法呢?

您可以单独分配其他依赖项。只需在末尾添加一行:

$(addsuffix .o,${SPECIAL}): b.h

要不必处理依赖项顺序,请替换
$您可以单独分配其他依赖项。只需在末尾添加一行:

$(addsuffix .o,${SPECIAL}): b.h

为了不必处理依赖项顺序,替换
$答案很好,但更好的方法是对头文件上的所有依赖项使用自动依赖项生成(google for it),错误消息看起来像来自gcc,而不是make。编译单元TypesForArticle.h中是否有代码,或者为什么要编译头文件?在案例2中,您将配方分配给了错误的规则。将最后一行与前一行交换,这样就行了。非常感谢。你可以考虑编辑你的答案,清楚地显示你的额外代码行的位置。作为一名新手,我误解了“遵守规则”的含义。@Fabio更新了我的答案。我假设配方是规则的一部分。答案很好,但更好的方法是对头文件上的所有依赖项使用自动依赖项生成(google for it),错误消息看起来像来自gcc,而不是make。编译单元TypesForArticle.h中是否有代码,或者为什么要编译头文件?在案例2中,您将配方分配给了错误的规则。将最后一行与前一行交换,这样就行了。非常感谢。你可以考虑编辑你的答案,清楚地显示你的额外代码行的位置。作为一名新手,我误解了“遵守规则”的含义。@Fabio更新了我的答案。我假设配方是规则的一部分。不能让它太有效(在第一个版本中)。您能详细说明一下吗?@Fabio错误消息是什么,或者它是如何工作的?
$(BINDIR)/%$(OBJ):%.cpp$(LIBHEADERS)Makefile objdir
${PAPEROBJS}:$(PAPERHEADERS)
`(CC)-c$(CFLAGS)$<-o$`好的,格式不正确。这应该是3行。它不调用创建bin目录的objdir伪目标。如果我手动创建目录,那么尝试使用h文件作为o文件的主要源时会出错。请注意:您不需要确保规则以任何特定顺序出现,也不需要担心先决条件顺序。GNU make始终使用列表中首先包含配方的规则的先决条件,并且任何其他先决条件都会按照它们在make文件中出现的顺序添加到列表的末尾。所以,
$不能让它太工作(在第一个版本中)。您能详细说明一下吗?@Fabio错误消息是什么,或者它是如何工作的?
$(BINDIR)/%$(OBJ):%.cpp$(LIBHEADERS)Makefile objdir
${PAPEROBJS}:$(PAPERHEADERS)
`(CC)-c$(CFLAGS)$<-o$`好的,格式不正确。这应该是3行。它不调用创建bin目录的objdir伪目标。如果我手动创建目录,那么尝试使用h文件作为o文件的主要源时会出错。请注意:您不需要确保规则以任何特定顺序出现,也不需要担心先决条件顺序。GNU make始终使用列表中首先包含配方的规则的先决条件,并且任何其他先决条件都会按照它们在make文件中出现的顺序添加到列表的末尾。所以
$