我在编译项目期间遇到一个不时出现的问题(不一致): 部分编译创建“归档”(.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%的时间)。失败总是相同的,但它不可重复(完全零星的 - 我们在具有相同环境的情况下测试不同的机器与确切的情况。在我们可以解释它的情况下,失败是完全随机的)。 我已经在这个问题上坚持了好几个星期了,并且会感谢任何可能指向我们正确方向的想法。