Compiler errors “生成文件错误”;“文件存在”;当make-j2

Compiler errors “生成文件错误”;“文件存在”;当make-j2,compiler-errors,makefile,Compiler Errors,Makefile,每当我只使用“make”进行编译时,我的Makefile工作正常。但是当我使用“make-j2”时,我得到的错误是 mkdir: cannot create directory `objects': File exists make: *** [objects/robot_driver_agent.o] Error 1 这是Makefile- INCLUDE = -I/usr/include/X11 -I/usr/local/include -I/usr/local/include/FL/im

每当我只使用“make”进行编译时,我的Makefile工作正常。但是当我使用“make-j2”时,我得到的错误是

mkdir: cannot create directory `objects': File exists
make: *** [objects/robot_driver_agent.o] Error 1
这是Makefile-

INCLUDE = -I/usr/include/X11 -I/usr/local/include -I/usr/local/include/FL/images -I/usr/include/freetype2

CC=g++ 
CFLAGS=-w -D LINUX -O3 -fpermissive 
OBJDIR=objects
SRCDIR=src

LDFLAGS= -L/usr/X11R6/lib$(LIBSELECT) -lpthread -lfltk -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11

SOURCES_RAW= robot_driver_agent.cpp robot_driver_position.cpp robot_driver_priorityqueue.cpp main.cpp robot_driver_tree.cpp robot_driver_stack.cpp robot_driver_grid.cpp robot_driver_path.cpp grid_analyzer.cpp tcpserver.cpp tcpclient.cpp servercontrol.cpp clientcontrol.cpp robot.cpp udpserver.cpp udpclient.cpp owncontrol.cpp guiwindow.cpp rs232.cpp

TARGET:= go
TARGETD:= go_d

OBJECTS:=$(SOURCES_RAW:.cpp=.o)
OBJECTS:=$(patsubst %.o, $(OBJDIR)/%.o, $(OBJECTS))

SOURCES:=$(SOURCES_RAW)
SOURCES:=$(patsubst %.cpp, $(SRCDIR)/%.cpp, $(SOURCES))

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) -w -D LINUX $(INCLUDE) $^ -o $@ $(LDFLAGS)

$(OBJDIR)/%.o: src/%.cpp
    test -d $(OBJDIR) || mkdir $(OBJDIR)
    $(CC) -g -c $< $(CFLAGS) -o $@ 

debug: $(TARGETD)

$(TARGETD): $(OBJECTS)
    $(CC) -w -D LINUX $(INCLUDE) $^ -o $@ $(LDFLAGS)

%.o: $(SRCDIR)/%.cpp
    $(CC) -c -g $< $(CFLAGS)-o $@



.PHONY : clean
clean:
    rm -f $(OBJDIR)/*.o
    rm -f $(TARGET) $(TARGETD)
INCLUDE=-I/usr/INCLUDE/X11-I/usr/local/INCLUDE-I/usr/local/INCLUDE/FL/images-I/usr/INCLUDE/freetype2
CC=g++
CFLAGS=-w-dlinux-O3-fpermissive
OBJDIR=对象
SRCDIR=src
LDFLAGS=-L/usr/X11R6/lib$(LIBSELECT)-lpthread-lfltk-lXext-lXft-lfontconfig-lXinerama-lpthread-ldl-lm-lX11
来源\u RAW=robot\u driver\u agent.cpp robot\u driver\u position.cpp robot\u driver\u priorityqueue.cpp main.cpp robot\u driver\u stack.cpp robot\u driver\u grid.cpp robot\u driver\u path.cpp grid\u analyzer.cpp tcpserver.cpp tcpclient.cpp servercontrol.cpp clientcontrol.cpp robot.cpp udpserver.cpp owncontrol.cpp guiwindow.cpp rs232.cpp
目标:=开始
TARGETD:=开始
对象:=$(源\原始:.cpp=.o)
对象:=$(patsubst%.o,$(OBJDIR)/%.o,$(对象))
来源:=$(来源\u原始)
来源:=$(patsubst%.cpp,$(SRCDIR)/%.cpp,$(来源))
全部:$(目标)
$(目标):$(对象)
$(CC)-w-dlinux$(包括)$^-o$@$(LDFLAGS)
$(OBJDIR)/%.o:src/%.cpp
测试-d$(OBJDIR)| mkdir$(OBJDIR)
$(CC)-g-c$<$(CFLAGS)-o$@
调试:$(TARGETD)
$(目标):$(对象)
$(CC)-w-dlinux$(包括)$^-o$@$(LDFLAGS)
%.o:$(SRCDIR)/%.cpp
$(CC)-c-g$<$(CFLAGS)-o$@
.假冒:干净
清洁:
rm-f$(OBJDIR)/*.o
rm-f$(目标)$(目标)

有人能告诉我为什么在-j2中同时使用这两个处理器会出现此错误,以及如何修复它吗?感谢您的帮助。

不要创建这样的目录;这是一个等待发生的比赛条件。让Make为您处理依赖项解析:

 $(OBJECTS): | $(OBJDIR)

 $(OBJDIR):
         mkdir $(OBJDIR)

这是直接从Make手册中的中获取的。

使用
mkdir-p
。它是幂等的(如果用同一个参数执行两次,甚至并行执行,则没有问题)如果您提供包含多个组件的路径名,则会生成所有目录

在这里查看我的Makefile:

mkdir-p
的几个实例。当然,当我运行make-j时,我确实看到发出了多个
mkdir-p
作业,但这不是问题

另一个想法是在mkdir命令上添加
-
。(就像在
clean
目标规则中使用的
rm
)。但这忽略了一个真正的错误,而不仅仅是
EEXIST


p.S.逻辑,如
如果目录不存在,那么mkdir…
将不起作用,因为它具有竞争条件。如果计算
时目录可能不存在,但当计算
mkdir
时,目录突然存在。在parallel make中,您必须担心竞争,因为为parallel make编写规则是一种并发编程形式。

这确实有效,但每次编译文件时,我都会得到“mkdir objects mkdir:cannot create directory`objects':file exists”。我该怎么处理这件事?@Sterling:你不该明白这个意思。你能创建一个最小的测试用例吗?(即一个更简单的makefile)。哦,这是因为我在两个目标中使用了mkdir。谢谢你的帮助!此外,在过去的Makefiles中,我通过将目录视为显式依赖项并使用创建它的规则来实现这一点。这将正确地并行化:
make
将构建目录,然后分派依赖于它的并行规则。