编写makefile以在调试版本中使用-D_GLIBCXX_DEBUG

时间:2011-12-10 02:46:53

标签: c++ gcc makefile

我有一个可以简化为的makefile:

OBJS = obj1.o obj2.o

FLAGS = -Wall -Wextra -Werror -pedantic-errors -fno-rtti -std=c++0x
DEBUG_FLAGS = -ggdb -O0 -fstack-protector-all -D_GLIBCXX_DEBUG
RELEASE_FLAGS = -O3

release: $(OBJS)
    g++ $(FLAGS) $(RELEASE_FLAGS) $(OBJS)

debug: $(OBJS)
    g++ $(FLAGS) $(DEBUG_FLAGS) $(OBJS)

obj1.o: obj1.cpp
    g++ -c $(FLAGS) obj1.cpp

obj2.o: obj2.cpp
    g++ -c $(FLAGS) obj2.cpp

问题是必须使用-D_GLIBCXX_DEBUG标志构建所有文件或不构建任何文件。我不知道如何在不为每个编译单元写入两个条目的情况下执行此操作,例如

obj1_release.o: obj1.cpp
    g++ -c $(FLAGS) $(RELEASE_FLAGS) obj1.cpp

obj1_debug.o: obj1.cpp
    g++ -c $(FLAGS) $(DEBUG_FLAGS) obj1.cpp

只有当用户键入-D_GLIBCXX_DEBUG而不为每个CU写入两个条目时,如何使make debug标志(以及其他调试标志)对所有编译单元生效? (反之亦然;当用户键入make release时,释放标志需要对所有CU生效。)

如果这是编写Makefile的基础知识我很抱歉,我对它们知之甚少。

3 个答案:

答案 0 :(得分:4)

您正在寻找pattern rules:这样的事情应该做您想做的事情。请注意,除非程序的调试版和发行版具有不同的名称,否则无法正常工作。

OBJS   := obj1 obj2 obj3
R_OBJS := $(OBJS:=_r.o)
D_OBJS := $(OBJS:=_d.o)

all: prog_r prog_d
release: prog_r
debug: prog_d

prog_r: $(R_OBJS)
    $(CXX) $(CXXFLAGS) $(RELEASE_FLAGS) $(LDFLAGS) $^ $(LIBS) -o $@

prog_d: $(D_OBJS)
    $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) $(LDFLAGS) $^ $(LIBS) -o $@

%_r.o: %.cc
    $(CXX) $(CXXFLAGS) $(RELEASE_FLAGS) -c $< -o $@

%_d.o: %.cc
    $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) -c $< -o $@

# header files
obj1_d.o obj1_r.o: foo.h bar.h
obj2_d.o obj2_r.o: quux.h
# ... etc ...

答案 1 :(得分:1)

根据Makefile中的构建类型,有一个pretty straightforward way来选择编译标记。

除此之外,您可能希望确保调试版本仅链接调试目标文件和发布版本(即没有混合调试和发布目标文件)。根据构建类型将该编译对象实现到不同的目录中。

答案 2 :(得分:0)

这可能会有所帮助:http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_7.html

您可以检查第一个参数(调试/发布)并相应地设置CFLAGS。

HTH。