gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:48:27 27 4
gpt4 key购买 nike

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

g++ -o main -g *.cpp

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

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 调试文件?

最佳答案

如果您想要调试文件,您必须使用-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,并仅为后者:

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

您可以进一步改进它,但这应该让您入门。

关于c++ - 使用 makefile 分别编译每个源文件时创建一个调试文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com