Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用%的makefile目标的顺序_Makefile - Fatal编程技术网

使用%的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仍将尝试以相同的顺序启动生成,但因为某些生成完成得比其他生

出于好奇,在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仍将尝试以相同的顺序启动生成,但因为某些生成完成得比其他生成快,你可能会同时得到不同的目标建筑。

我实际上是在问
foo.o:foo.c
bar.o:bar.c
baz.o:baz.c
所有这些都源自
%.o:%.c
。。。处理目标的顺序是什么?我想你可能误解了模式规则。模式规则是一个模板,如果要求它构建一个目标,并且没有明确的规则来实现它,则make可以使用它。模式规则并不是一条指令,它不应该发出指令,找到所有可能与这些目标匹配的文件,并构建它们。换句话说,如果您有一个makefile,其中只有一个模式,并且您键入
make
make,那么什么也不会发生。因此,正如我在回答中所说,make决定构建这些目标的顺序是这样的。好吧,你是说这些
*.o
目标来自于一些早期的target
prog.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)默认情况下对
通配符的输出进行排序。