Makefile 选择编译类型

Makefile Selecting type of compilation

我怎样才能使用 make debugmake release 之类的命令,以便它们都调用下面的规则集但具有不同的编译标志(例如 -g for调试和 -DNDEBUG 用于发布)?

# Object Files
OBJECTS         := $(addprefix $(BUILDDIR)/,$(SOURCEFILES:.cpp=.o))

compile: $(OUTPUT) $(MAIN)

$(OUTPUT):
    @mkdir $(BUILDDIR)

$(MAIN): $(OBJECTS)
    @$(CXX) $(CXXFLAGS) $(INCLUDES) $(LIBS) -o $(OUTPUTMAIN) $(OBJECTS)

$(BUILDDIR)/%.o: %.cpp
    @$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

.PHONY: debug release

debug:
    ... Compile with debug flags ...

release:
    ... Compile with release flags ...

不难,用target-specific variable values:

debug: CXXFLAGS += -g -whatever

release:  CXXFLAGS += -DNDEBUG -otherstuff

debug release: $(OBJECTS)
    link things...

但是你的设计有问题。您使用 debug 标志或 release 标志构建对象 foo.o,但无论哪种方式,您都将其命名为 foo.o 并将其放在同一构建目录中。所以稍后,当你构建时,说 release,并且那里已经有一个 foo.o,Make 会很乐意使用它。看到问题了吗?我建议你有两个构建目录,一个用于 debug,一个用于 release;还有其他方法,但您必须在修改 makefile 之前做出决定。