使用-g标志编译时,gdb中没有调试符号

15

我试图使用gdb调试程序,需要在编译时添加调试符号。我已经在我的makefile中添加了-g标志,但是当我在gdb中加载程序时仍然会得到"Reading symbols from ...(no debugging symbols found)"的错误提示。这是怎么回事?

以下是一个剥离部分内容的makefile示例:

CPP = g++
CFLAGS = -c -g -Wall

$(BIN): $(OBJ)
 $(CPP) $(LDFLAGS) $(OBJ) -o $(BIN) $(LIBS)

<test.o>: <test.cpp>
 $(CPP) $(CFLAGS) <test.cpp> -o <test.o>

如果您想查看整个内容,可以直接在这里访问,尽管我认为这不是必要的:

http://pastebin.com/vGNjy0ga

其他注意事项...我正在Windows上使用MinGW进行编译,并且我有SFML和OpenGL作为依赖项。

而且,我在makefile中找不到-s标志。


5
您可以使用“make -n”确认您的编译命令行上确实包含“-g”标志吗?我需要确认一下。 - chrisaycock
F:\ rowdump \ rom \ ROMV> make -n g ++ -Wall src / obj / core.o src / obj / image.o src / obj / gnd.o src / obj / gat.o src / obj / world.o src / obj / rsw.o src / obj / camera.o src / obj / rsm.o src / obj / main.o -o romv -Wl,--enable-auto-import,-subsystem,windows -lsfml-main -lsfml-graphics -lsfml-window -lsfml-system -lopengl32 -lglu32它不在那里!奇怪...我的 -ansi 和 -pendantic 标志也消失了。 - delaccount992
3
Kobie粘贴的输出是针对默认目标的,这是用于链接的,并且那里没有-g标志。我在Ubuntu上确认过,在链接期间只需要编译时不需要该标志。我认为你应该尝试"make -n test.o"来查看所使用的编译命令。 - binW
顺便提一下,按照惯例,您应该使用 CXXFLAGS 来编译 C++ 代码,而使用 CFLAGS 来编译纯 C 代码。 - Alexis Wilke
6个回答

6
我在使用继承来的一些旧F77代码时遇到了同样的问题。我尝试了所有人推荐的标志(-g -ggdb等),但解决方案是运行make clean。如果您没有该文件或不知道它的含义,基本上需要删除所有已编译的(.o)文件。
由于只更改了标志,makefile并不知道重新编译,因此当我认为正在使用-g或-ggdb进行编译时,实际上并未这样做。希望这能对某些人有所帮助!

6

啊,非常抱歉。我的makefile中“clean:”部分出了问题。因此当我使用make clean时没有任何反应。手动删除.o文件解决了这个问题。现在标志正常工作。无论如何,感谢所有发布帖子的人!现在可以删除这个帖子了。


而且奇怪的是,即使make -n显示我的-g标志已被剥离,实际上它并没有。 - delaccount992
2
binW 上面有一条注释说你的 make -n 只显示链接部分,而不是编译部分。确保你只看了 make -n test.o - chrisaycock

1
尝试替换

$(BIN): $(OBJ)
 $(CPP) $(LDFLAGS) $(OBJ) -o $(BIN) $(LIBS)

使用

$(BIN): $(OBJ)
 $(CPP) $(CFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS) $(LIBS)

注意:-c选项不能与可执行文件一起使用


这样做行不通,因为最终的可执行文件不能使用“-c”。此外,从在GNU / Linux上对g ++ 4.4.1进行快速测试来看,链接时似乎不需要“-g”。 - Matthew Flaschen
我的错,是的,你是正确的,-c选项不适用于可执行文件。 - Alam

1

我认为在将对象链接到二进制代码时需要使用-g

CPP = g++
CFLAGS = -g -Wall

$(BIN): $(OBJ)
 $(CPP) $(CFLAGS) $(OBJ) -o $(BIN) $(LDFLAGS) $(LIBS)

<test.o>: <test.cpp>
 $(CPP) $(CFLAGS) -c <test.cpp> -o <test.o>

1

我对Mingw没有太多经验,但尝试用-ggd替换-g。这可能会解决你的问题。根据gcc手册

生成调试信息供GDB使用。这意味着使用可用的最具表现力格式(DWARF 2、stabs或本机格式,如果这两种都不被支持),包括尽可能使用GDB扩展。


在我的(GNU/Linux g++)手册上,常规的“-g”表示,“GDB可以使用此调试信息”。 - Matthew Flaschen
DWARF 2主要用于在调试时获取宏的值。 - Alam
我尝试过使用-g-g -ggdb,只有后者才产生了可读的符号。 - Peter Krebs

0

我不确定,但我认为你需要在链接时加上-g。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接