以下是makefile
的一部分:
OBJDIR = ../../../build_project/obj
BINDIR = ../../../build_project/bin
SOURCES = $(wildcard *.cpp)
OBJECTS = $(addprefix $(OBJDIR)/, $(SOURCES:.cpp=.o))
TARGET = $(BINDIR)/project
.PHONY: clean distclean
clean:
rm $(OBJECTS)
当我运行make clean
时,这是我得到的输出:
rm
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
make: *** [clean] Error 64
我不知道该怎么做这个错误。我格式化OBJECTS
错了吗?
答案 0 :(得分:2)
如果您的源文件位于../source
目录中,那么您必须在那里找到它们,如下所示:
SRCDIR = ../source
SOURCES := $(wildcard $(SRCDIR)/*.cpp)
(我们在这里使用:=
而不是=
来提高效率;请参阅GNU make手册。现在,如果您想将对象文件放在其他位置,则需要将$(SRCDIR)/foo.cpp
转换为$(OBJDIR)/foo.o
,如下所示:
OBJECTS := $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SOURCES))
现在你必须告诉make如何在一个目录中从另一个目录中的源文件构建一个对象;内置的make规则只知道如何在同一目录中的源文件中构建当前目录中的对象(或通过VPATH找到,我们在此不再讨论)。这给出了这样的东西:
$(OBJDIR)/%.o : $(SRCDIR)/%.cpp
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
(这是使用内置规则中使用的make的内置变量)。