make先决条件比目标更新但目标不是ramade

时间:2016-12-19 08:52:00

标签: makefile prerequisites

我在编译项目期间遇到一个不时出现的问题(不一致): 部分编译创建“归档”(.a)文件。由于某种原因,这些档案中的一个缺少一个对象,后来导致最终链接失败。 以下是makefile中执行此操作的代码:

$(MODULE_LIB): $(addprefix $(OBJDIR)/, $(COMPILED_OBJECTS) $(EXTRA_OBJECTS) )
    @echo 
    @echo Insert files into target archive = $(MODULE_LIB)
    @rm -rf $*.tmp.a ; mv -f $@ $*.tmp.a 2>/dev/null || true
    $(AR) -s -r $*.tmp.a $?
    @mv -f $*.tmp.a $@
    chmod uga+r $@

MODULE_LIB是“libEXC.a”

目标文件($(OBJDIR)/ $(COMPILED_OBJECTS)是“EXC_DesignDependent.o”

我在make程序中添加了“-d”标志,这里是最后几行的片段:

    Successfully remade target file `/WARTS/wrkdir/1481986500184/EXC/objs/EXC_DesignDependent.o'.
    Finished prerequisites of target file `/WARTS/wrkdir/1481986500184/static/libEXC.a'.
    Prerequisite `/WARTS/wrkdir/1481986500184/EXC/objs/EXC_DesignDependent.o' is newer than target `/WARTS/wrkdir/1481986500184/static/libEXC.a'.
    No need to remake target `/WARTS/wrkdir/1481986500184/static/libEXC.a'.
    Finished prerequisites of target file `EXC'.
    Must remake target `EXC'.
    Successfully remade target file `EXC'.
    Finished prerequisites of target file `ROOT'.

据我所知,对象“EXC_DesignDepedent.o”应该放在档案库“libEXC.a”中,因为它是它的先决条件,“make”清楚地表示它比目标更新。

我确定我们没有任何“|”在先决条件中,可能已将先决条件声明为仅订单类型而非“正常”类型。

为了验证对象确实不是归档的一部分,我运行了以下命令:

nm libEXC.a | grep ":"

我得到了这个:

EXC_MainLoop.o:
EXC_Generate.o:

现在,这是最棘手的部分: 此代码在5种不同的环境中运行。它完美地完成了所有这些的编译和链接。 仅在其中一个环境中,它不时会出现上述故障(大约1%的时间)。失败总是相同的,但它不可重复(完全零星的 - 我们在具有相同环境的情况下测试不同的机器与确切的情况。在我们可以解释它的情况下,失败是完全随机的)。 我已经在这个问题上坚持了好几个星期了,并且会感谢任何可能指向我们正确方向的想法。

0 个答案:

没有答案