我有一个问题,即每次并行构建时,归档器似乎都没有完全正确地归档目标文件。我用make -j32
如果我调查档案:
ar x mylib.a
ls -l myFile.o
-rw-rw-r-- 1 tester users 0 Mar 00:00:00 myFile.o
同样运行程序nm
不会显示任何符号。
但是,当我调查obj目录中的目标文件时,该文件具有符号和非零大小,因此似乎归档程序没有正确归档lib。
我用于构建libs的makefile如下所示:
AR := flock make.lock $(AR)
all: createLib
TARGET_OBJECTS = $(addprefix $(OBJDIR)/, $(OBJECTS))
createLib: $(TARGET_OBJECTS)
@echo "----- Archiving lib ($(LIB))"
mkdir -p $(LIBDIR)
$(AR) ru $(LIBDIR)/$(LIB) $^
$(OBJDIR)/%.o: %.cc
@echo "----- Compiling file $< for ($(LIB))"
$(VERB)mkdir -p $(@D)
$(VERB)mkdir -p $(OBJDIR)
$(VERB)$(CXX) $(CXXFLAGS) $(CPPFLAGS) $($(*F)_CPPFLAGS) -c $(addprefix ${PWD}/, $<) -o $@
正如您所看到的,我甚至使用文件锁来确保只有一个线程可以同时归档lib。那么为什么对象文件是空的?我已经指定仅在目标文件完成构建时存档的lib,但似乎存在竞争条件,归档程序在最后一个目标文件完全构建之前开始存档。那么这种行为可能是什么原因呢?
我应该补充说,它似乎主要是库中的一个文件,它可以解决这个问题,但它也可以是其他文件。