【问题标题】:No debugging symbols in gdb even when compiling with -g flag即使使用 -g 标志编译,gdb 中也没有调试符号
【发布时间】:2010-12-31 06:10:19
【问题描述】:

我正在尝试使用调试符号编译我的程序以在 gdb 中使用。我已将 -g 标志添加到我的 makefile 中,但是当我在 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>

如果你想看完整的东西,你可以去这里,虽然我不认为这是必要的:

http://pastebin.com/vGNjy0ga

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

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

【问题讨论】:

  • 你能用make -n 确认你确实在你的编译行上得到了-g 标志吗?
  • 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 标志也不见了。编辑:对不起文字墙。没想到会变成这样。
  • Kobie 粘贴的输出是用于默认目标的,用于链接,并且那里没有 -g 标志。我刚刚在 Ubuntu 上确认,仅在编译时链接期间不需要该标志。我觉得你应该试试“make -n test.o”看看用什么命令来编译。
  • 附带说明,按照惯例,C++ 使用 CXXFLAGS,普通 C 使用 CFLAGS。

标签: c++ gcc makefile gdb debug-symbols


【解决方案1】:

啊。我很抱歉。事实证明,我的 makefile 的“干净:”部分已损坏。因此,当我使用 make clean 时,什么也没发生。手动删除 .o 文件可解决问题。标志现在可以正常工作。感谢所有发布的人!现在可以删除了。

【讨论】:

  • 奇怪的是,尽管 make -n 显示我的 -g 标志已被剥离,但实际上并没有。
  • binW 上面有评论说您的make -n 只显示链接部分,而不是编译部分。确保您只查看make -n test.o。
【解决方案2】:

在使用我在一些旧的 F77 代码上继承的 makefile 时,我遇到了同样的问题。我尝试了人们推荐的所有标志(-g -ggdb ...等) 解决方案已运行 ma​​ke clean 如果你没有那个或知道它的意思,基本上删除所有编译的(.o)文件。

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

【讨论】:

    【解决方案3】:

    尝试替换

    $(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。
    • 我的错,是的,你是对的 -c 选项不适用于可执行文件
    【解决方案4】:

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

    生成调试信息以供使用 由 GDB 提供。这意味着使用最 可用的表达格式(DWARF 2, stabs,或者原生格式,如果两者都没有 其中支持),包括 GDB 尽可能扩展。

    【讨论】:

    • 在我的 (GNU/Linux g++) 手册中,常规的 -g 说,“GDB 可以使用这些调试信息。”
    • DWARF 2主要用于调试时获取MACROS的值
    • 我试过-g,还有-g -ggdb。只有后者产生可读的符号。
    【解决方案5】:

    我认为在将对象链接到二进制代码时需要-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>
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多