C++ 即使在使用-g标志编译时,gdb中也没有调试符号

C++ 即使在使用-g标志编译时,gdb中也没有调试符号,c++,gcc,makefile,gdb,debug-symbols,C++,Gcc,Makefile,Gdb,Debug Symbols,我试图用调试符号编译我的程序,以便在gdb中使用。我已经在makefile中添加了-g标志,但是当我在gdb中加载程序时,仍然会得到“从…读取符号(未找到调试符号)”。怎么了 下面是我的makefile的一个精简示例,它应该有相关的位: CPP = g++ CFLAGS = -c -g -Wall $(BIN): $(OBJ) $(CPP) $(LDFLAGS) $(OBJ) -o $(BIN) $(LIBS) <test.o>: <test.cpp> $(CPP

我试图用调试符号编译我的程序,以便在gdb中使用。我已经在makefile中添加了-g标志,但是当我在gdb中加载程序时,仍然会得到“从…读取符号(未找到调试符号)”。怎么了

下面是我的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>
CPP=g++
CFLAGS=-c-g-Wall
$(BIN):$(OBJ)
$(CPP)$(LDFLAGS)$(OBJ)-o$(BIN)$(LIBS)
: 
$(CPP)$(CFLAGS)-o
如果你想了解整个情况,你可以到这里来,尽管我认为没有必要:

杂项注释。。我在Windows上使用MinGW进行编译,我将SFML和OpenGL作为依赖项


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

我不确定,但我认为即使在链接时也需要-g。

尝试替换

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

(编辑)
注意:-c选项不适用于可执行文件

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

生成调试信息以供使用 由GDB提供。这意味着使用最多的资源 可用的表达格式(DWARF 2, STAB或本机格式(如果两者都不是) 其中一个受支持),包括GDB 如果可能的话,请延期


啊。我很抱歉。结果我的makefile的“clean:”部分被破坏了。因此,当我使用“清理”时,什么也没发生。手动删除.o文件修复了该问题。旗子现在很好用。感谢所有发帖子的人!现在可以删除它。

我认为在将对象链接到二进制代码时需要
-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>
CPP=g++
CFLAGS=-g-墙
$(BIN):$(OBJ)
$(CPP)$(CFLAGS)$(OBJ)-o$(BIN)$(LDFLAGS)$(LIBS)
: 
$(CPP)$(CFLAGS)-c-o

我在使用一些旧F77代码上继承的makefile时遇到了同样的问题。我尝试了人们推荐的所有标志(-g-ggdb…等等) 已运行解决方案清除 如果你不知道这意味着什么,基本上删除所有编译的(.o)文件


makefile不知道如何重新编译,因为只有标志被更改,所以当我认为是的时候,我实际上并没有使用-g或-ggdb进行编译。希望这对别人有帮助

你能用
make-n
确认你确实在编译行上得到了
-g
标志吗?F:\rowdump\rom\ROMV>make-ng++-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 ROMV-Wl子系统,启用自动导入,windows-lsfml main-lsfml graphics-lsfml window-lsfml system-lopengl32-lglu32它不在那里!奇怪的我的-ansi和-pendantic标志也不见了。编辑:很抱歉出现了文字墙。没有意识到结果会是这样的。Kobie粘贴的输出是用于默认目标的,用于链接,并且没有-g标志。我刚刚在Ubuntu上确认,只有在编译时链接时才需要这个标志。我认为你应该尝试“做-N测试”来查看使用什么命令来编译。作为一个旁注,按照惯例,C++中使用<代码> CXXFLAGG/<代码>和Cult> CfLaS> <代码>,这是不起作用的,因为最终的执行程序不能使用<代码> -C/代码>。另外,(在GNU/Linux上对g++4.4.1进行的快速测试中)在链接时似乎不需要
-g
。我的错,是的,你是对的-c选项不能与executableOn一起工作在我的(GNU/Linux g++)手册上,常规的
-g
说,“GDB可以使用此调试信息。”DWARF 2主要用于在调试时获取宏的值。我曾尝试使用
-g
,以及
-g-ggdb
。只有后者产生了可读的符号。奇怪的是,尽管make-n显示my-g标志已被去除,但实际上它没有。binW在上面有一条评论,您的
make-n
只显示链接部分,而不是编译部分。确保只查看
Make-n test.o
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>