C++ 编写makefile以在调试生成中使用-D_GLIBCXX_DEBUG

C++ 编写makefile以在调试生成中使用-D_GLIBCXX_DEBUG,c++,gcc,makefile,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) $(OBJ

我有一个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写入两个条目?反之亦然;当用户类型进行释放时,释放标志需要在所有CU上生效

如果这是编写Makefiles的基础,我很抱歉,我对它们了解不多。

您正在寻找的东西:像这样的东西应该可以满足您的需要。请注意,除非程序的调试版本和发布版本具有不同的名称,否则无法使其正常工作

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 ...
你正在寻找:像这样的东西应该做你想要的。请注意,除非程序的调试版本和发布版本具有不同的名称,否则无法使其正常工作

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 ...
这可能有助于:

您可以检查第一个参数debug/release并相应地设置CFLAGS

HTH.

这可能会有帮助:

您可以检查第一个参数debug/release并相应地设置CFLAGS

HTH.

有一个选项可以根据内置Makefiles的类型选择编译标志

除此之外,您可能希望确保“调试生成”仅链接调试对象文件,并且版本相同,即不混合调试和发布对象文件。根据生成类型,将编译对象编译到不同的目录中。

可以根据makefile中生成的类型选择编译标志


除此之外,您可能希望确保“调试生成”仅链接调试对象文件,并且版本相同,即不混合调试和发布对象文件。根据生成类型将编译对象编译到不同的目录中。

在定义生成变量的行上不需要那些美元符号。@Zack whoops,是的,我输入错误。在定义生成变量的行上不需要那些美元符号。@Zack whoops,是的,我打错了。是D_OBJS:=$OBJS:-\u D.o应该是D_OBJS:=$OBJS:=\u D.o,还是-应该只为D_OBJS而不是为R_OBJS而存在?这是个打字错误;在这两种情况下都应该是。将修复。那么如何处理每个.cc文件的依赖关系呢?例如,我有一些.cc文件依赖的头文件,而有些文件不依赖。我将它们标记为使用它们的文件的依赖项,以便在修改标题时重新编译,但它们不是不使用它们的文件的依赖项。这种方法似乎使所有的.cc文件都具有完全相同的先决条件,即它正在编译的.cc文件,还是我遗漏了什么?这些都是.o文件的适当依赖项,而不是.cc文件。在更改头文件时,您不必重新生成源代码,是吗?您可以在不使用命令的情况下在规则中列出它们,并且模式规则仍然适用。我将添加一个示例。如果您有10个以上的对象文件,您可能不想手动保持头文件依赖关系的最新状态-在这一点上,投资于学习,这将安排生成它们作为编译的副作用。D_OBJS:=$OBJS:-_D.o应该是D_OBJS:=$OBJS:=\u D.o,或者-应该只为D_OBJS而不是R_OBJS出现吗?这是一个打字错误;在这两种情况下都应该是。将修复。那么如何处理每个.cc文件的依赖关系呢?例如,我有一些.cc文件依赖的头文件,而有些文件不依赖。我将它们标记为使用它们的文件的依赖项,以便在修改标题时重新编译,但它们不是不使用它们的文件的依赖项。这种方法似乎使所有的.cc文件都具有完全相同的先决条件,即它正在编译的.cc文件,还是我遗漏了什么?这些都是.o文件的适当依赖项,而不是.cc文件。在更改头文件时,您不必重新生成源代码,是吗?您可以在不使用命令的情况下在规则中列出它们,并且模式规则仍然适用。我将添加一个示例。如果您有10个以上的对象文件,您可能不想手动保持头文件依赖项的最新状态-在这一点上,投资于学习,这将安排生成它们作为编译的副作用。