Makefile 选择编译类型
Makefile Selecting type of compilation
我怎样才能使用 make debug
或 make 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 之前做出决定。
我怎样才能使用 make debug
或 make 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 之前做出决定。