1

我在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

如果这是正确的方法,请发表评论。

4

1 回答 1

3

在考虑并行构建时,make仅根据先决条件列表来决定构建事物的顺序。如果没有将目标 FOO 定义为目标 BAR 的先决条件,那么 make 可以随意同时构建 FOO 和 BAR。

请记住,将两个目标列为同一目标的先决条件,如 中TARGET : FOO BAR所示,仅意味着 FOO 和 BAR 都必须在 TARGET 之前构建。这并不意味着FOO 和 BAR 之间有任何关系。因此,如果您有:

foo: rmlink mklink

然后 make 可以同时运行 rmlink 和 mklink 。如果您希望在 mklink 启动之前始终完成 rmlink,则必须声明它们之间的先决关系,例如:

mklink: rmlink

当然,请记住,您必须确保 mklink 目标是任何需要这些链接存在的链接器目标的先决条件。

这里可能有更多错误,但考虑到您显示的makefile的部分和您提出的问题,应该可以解决它。

于 2013-07-12T14:17:31.183 回答