2

这是我的(部分)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错误吗?

4

1 回答 1

1

如果您的源文件在../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 内置变量)。

于 2013-09-26T11:40:05.683 回答