我正在做一个包含多个源文件的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调试文件?
答案 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
既然按顺序,我们可以设置两个顶级目标main
和debug
,并仅为后者更改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
你可以进一步改善这一点,但这应该让你开始。