使用%的makefile目标的顺序
出于好奇,在makefile中使用使用%的makefile目标的顺序,makefile,Makefile,出于好奇,在makefile中使用 ${OBJ_DIR}/%.o: ${SRC_DIR}/%.cpp 我注意到它不是字典(比如ls-l)。 它只是随机的吗?它们是按照make walks作为先决条件图的顺序构建的 在没有并行作业的简单情况下(无-j选项),如果有如下目标: prog: foo.o bar.o. baz.o make将首先尝试构建foo.o,然后是bar.o,然后是baz.o,最后是prog 如果启用了并行作业,make仍将尝试以相同的顺序启动生成,但因为某些生成完成得比其他生
${OBJ_DIR}/%.o: ${SRC_DIR}/%.cpp
我注意到它不是字典(比如ls-l
)。
它只是随机的吗?它们是按照make walks作为先决条件图的顺序构建的 在没有并行作业的简单情况下(无
-j
选项),如果有如下目标:
prog: foo.o bar.o. baz.o
make将首先尝试构建foo.o
,然后是bar.o
,然后是baz.o
,最后是prog
如果启用了并行作业,make仍将尝试以相同的顺序启动生成,但因为某些生成完成得比其他生成快,你可能会同时得到不同的目标建筑。我实际上是在问
foo.o:foo.c
和bar.o:bar.c
和baz.o:baz.c
所有这些都源自%.o:%.c
。。。处理目标的顺序是什么?我想你可能误解了模式规则。模式规则是一个模板,如果要求它构建一个目标,并且没有明确的规则来实现它,则make可以使用它。模式规则并不是一条指令,它不应该发出指令,找到所有可能与这些目标匹配的文件,并构建它们。换句话说,如果您有一个makefile,其中只有一个模式,并且您键入make
make,那么什么也不会发生。因此,正如我在回答中所说,make决定构建这些目标的顺序是这样的。好吧,你是说这些*.o
目标来自于一些早期的targetprog.exe:foo.o bar.o baz.o
(他们做到了!),优先级是在那里确定的。所以我想我的问题是:为什么$(addprefix${OBJ_DIR}/,$(notdir$(SRC_FILES:.cpp=.o))
不是按字典顺序排列的?GNU make函数不会更改其参数的顺序。顺序与$(SRC_文件)
相同,$(patsubst)
或$(notdir)
或$(addprefix)
都不会更改顺序。如果您希望对结果进行排序,请显式调用$(sort)
函数(顺便说一句,该函数也会删除重复项)。现在,您可能会最终返回我们需要的信息,以回答最初的问题:),并说SRC_文件
是使用$(通配符*.cpp)
或类似内容构建的。。。所以你真正的问题是,wildcard
为什么不按顺序返回结果?这实际上取决于您拥有的GNU版本,但一些旧版本并不保证任何顺序:它们基本上是按照存储在目录中的顺序返回的。如果您愿意,可以如上所述使用排序
。较新版本的GNU make(4.3)默认情况下对通配符的输出进行排序。