使用makefile分别编译每个源文件时创建调试文件

时间:2014-05-13 02:56:42

标签: c++ debugging makefile g++

我正在做一个包含多个源文件的c ++项目,并试图习惯使用makefile。我希望能够使用gdb调试此程序。如果我在Terminal中使用以下命令进行编译,则可以正常工作:

g++ -o main -g *.cpp

但是,如果我只是调用make,它就不会生成调试文件(.dSYM文件),即使它编译程序正常。我认为这与首先创建单个目标文件有关。这是我的makefile:

all: main.o sort.o bubble.o quickSort.o rbs.o
    g++ -g -o main *.o -Wall -O2
main.o: main.cpp
    g++ -c main.cpp
sort.o: sort.cpp sort.h
    g++ -c sort.cpp
bubble.o: bubble.cpp bubble.h
    g++ -c bubble.cpp
quickSort.o: quickSort.cpp quickSort.h
    g++ -c quickSort.cpp
rbs.o: rbs.cpp rbs.h
    g++ -c rbs.cpp
clean:
    rm *.o

如何在使用这样的makefile时创建main.dSYM调试文件?

1 个答案:

答案 0 :(得分:2)

如果需要调试文件,则必须使用-g编译所有组件。

执行此操作的粗略方法是将-g添加到每个对象规则:

all: main.o sort.o bubble.o quickSort.o rbs.o
    g++ -g -o main *.o -Wall -O2
main.o: main.cpp
    g++ -c -g main.cpp
sort.o: sort.cpp sort.h
    g++ -c -g sort.cpp
bubble.o: bubble.cpp bubble.h
    g++ -c -g bubble.cpp
quickSort.o: quickSort.cpp quickSort.h
    g++ -c -g quickSort.cpp
rbs.o: rbs.cpp rbs.h
    g++ -c -g rbs.cpp

但这并没有让您选择在没有调试信息的情况下构建。这个makefile中有很多冗余。让我们分阶段进行。首先,我们放入自动变量来简化规则:

all: main.o sort.o bubble.o quickSort.o rbs.o
    g++ -g -o main $^ -Wall -O2
main.o: main.cpp
    g++ -c -g $<
sort.o: sort.cpp sort.h
    g++ -c -g $<
bubble.o: bubble.cpp bubble.h
    g++ -c -g $<
quickSort.o: quickSort.cpp quickSort.h
    g++ -c -g $<
rbs.o: rbs.cpp rbs.h
    g++ -c -g $<

现在我们看到所有* .o规则都有相同的命令,这提醒我们Make已经知道如何从foo.cpp构建foo.o,其命令如下:

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

所以我们要做的就是将-g添加到CXXFLAGS,我们可以完全省略命令:

CXXFLAGS += -g
all: main.o sort.o bubble.o quickSort.o rbs.o
    g++ -g -o main $^ -Wall -O2
sort.o: sort.h
bubble.o: bubble.h
quickSort.o: quickSort.h
rbs.o: rbs.h

既然按顺序,我们可以设置两个顶级目标maindebug,并仅为后者更改CXXFLAGS

debug: CXXFLAGS += -g
main debug: main.o sort.o bubble.o quickSort.o rbs.o
    g++ -g -o $@ $^ -Wall -O2
sort.o: sort.h
bubble.o: bubble.h
quickSort.o: quickSort.h
rbs.o: rbs.h

你可以进一步改善这一点,但这应该让你开始。