Makefile 仅为列表中的某些文件指定先决条件

Makefile 仅为列表中的某些文件指定先决条件,makefile,gnu-make,Makefile,Gnu Make,如果main.cpp包含functions.h,如果functions.h发生变化,是否必须重新链接main.o 如果没有,我想知道什么时候会有这样的文件列表: objects = main.o factorial.o hello.o $(objects): %.o: %.cpp recipe 和factorial.cpp(定义functions.h中声明的函数)和hello.cpp(定义functions.h中声明的函数)以及main.cpp都包括functions.h;我有这样一

如果
main.cpp
包含
functions.h
,如果
functions.h
发生变化,是否必须重新链接
main.o

如果没有,我想知道什么时候会有这样的文件列表:

objects = main.o factorial.o hello.o
$(objects): %.o: %.cpp
    recipe
factorial.cpp
(定义functions.h中声明的函数)和
hello.cpp
(定义functions.h中声明的函数)以及
main.cpp
都包括
functions.h
;我有这样一条规则:

objects = main.o factorial.o hello.o
$(objects): %.o: %.cpp
    recipe
如何指定只有
$(objects)
中的某些文件应该具有
functions.h
的先决条件?如果我仅为
main.o
创建特殊规则:

main.o: main.cpp 
    recipe

$(objects): %.o: %.cpp functions.h
  recipe

第二条规则是否也应用于main.o,从而不必要地具有必备函数。h?

如果
main.cpp
包含头文件
functions.h
,则每当
functions.h
更改时,应重新生成
main.o

只需编写所需的先决条件,即可指定某些文件应依赖于标题:

objects = main.o factorial.o hello.o

$(objects): %.o: %.cpp
        recipe

factorial.o hello.o: functions.h
现在这两个
.o
文件依赖于
函数.h
,但
main.o
不依赖

编辑

哈,这是一个典型的例子,可以得到你所问问题的答案,而不是你想要回答的问题:)

您可以使用和函数轻松完成此操作。例如,假设您有:

SOME := foo.o bar.o
ALL := $(SOME) biz.o baz.o boz.o blah.o blee.o bor.o bag.o

$(ALL): %.o: %.cpp
        recipe

$(filter-out $(SOME),$(ALL)): functions.h

然而,也许你应该退一步问问自己,你是否真的想要或需要这样做。如果你真的在这里讨论C/C++程序中的头文件,那就不是别的了,你真的有那么多文件,也许你应该考虑添加到你的MaX文件中,而不是手工写出来。好吧,你的第一个答案意味着我一开始就有错误的想法。我考虑了你的第二个答案,但如果对象列表中有1000个名称,那么在上一条规则中写出所有名称是不实际的,所以这就是我遇到的问题。我希望有某种方法可以编写
$(objects)-main.o
。我也在问题的结尾加了一点。这是怎么回事?不,只是读一些教程,想知道事情是怎么回事。谢谢你的帮助。