我遇到make中的并行构建问题,即有这个定义
rmlink:
$(RM) $(ALIB)
$(RM) $(BLIB)
$(RM) $(CLIB)
$(RM) $(DLIB)
$(RM) $(ELIB)
mklink:
ln -sf $(ALIB_WITHPATH) $(ALIB)
ln -sf $(BLIB_WITH_PATH) $(BLIB)
ln -sf $(CLIB_WITH_PATH) $(CLIB)
ln -sf $(DLIB_WITH_PATH) $(DLIB)
ln -sf $(E_LIB) $(ELIB)
并使用make
启动构建我将构建这些目标
$ make
/bin/rm -f libA.so
/bin/rm -f libB.so
/bin/rm -f libC.so
/bin/rm -f libD.so
/bin/rm -f libE.so
ln -sf ../libA.so libA.so
ln -sf ../libB.so libB.so
ln -sf ../libC.so libC.so
ln -sf ../libD.so libD.so
ln -sf ../libE.so libE.so
但是使用make -j 2
(或更多)的并行构建启动它,我会得到:
$ make -j 2
/bin/rm -f libA.so
ln -sf ../libB.so libB.so
/bin/rm -f libB.so
/bin/rm -f libC.so
/bin/rm -f libD.so
ln -sf ../libD.so libD.so
/bin/rm -f libE.so
ln -sf ../libA.so libA.so
ln -sf ../libC.so libC.so
ln -sf ../libE.so libE.so
g++: libB.so: No such file or directory
在这种特殊情况下会删除我libB.so
的链接,而不会再次创建它 - 打破生效。
如何修复此问题才能启动并行构建?
修改
向mklink
目标添加类似内容似乎可以解决问题:
mklink: rmlink
请评论这是否正确。
答案 0 :(得分:3)
在考虑并行构建时,make决定由先决条件列表构建 的顺序。如果目标FOO未被定义为目标BAR的先决条件,那么make将可以同时构建FOO和BAR。
请记住,将两个目标列为同一目标的先决条件,如TARGET : FOO BAR
,这意味着必须在TARGET之前构建FOO和BAR。它 NOT 意味着FOO和BAR与每个其他有任何关系。所以如果你有:
foo: rmlink mklink
然后make可以同时运行rmlink和mklink。如果你想在mklink启动之前总是完成rmlink,你必须在它们之间声明一个必要的关系,如:
mklink: rmlink
当然,请记住,您必须确保mklink目标是任何需要存在这些链接的链接器目标的先决条件。
这里可能会有更多错误,但考虑到你所展示的makefile的部分内容以及你提出的问题,应该修复它。