【问题标题】:gcc doesn't include debug symbols when compiling with library使用库编译时 gcc 不包含调试符号
【发布时间】:2013-11-04 21:24:14
【问题描述】:

我遇到了 gcc 无法生成调试符号的奇怪问题,非常感谢一些帮助。

当然,我可能在这里做了一些愚蠢的事情,但我没有忘记 -g 或 -ggdb,而且我也没有在其中偷偷添加 -s。这是信息:

我有一个名为 list 的静态库(这是一项学校作业),以及两个以不同方式包含它的程序。

在 main(编译为 fifo)列表中包含为 #include "list.h",而在 prodcons 中,它包含为 #include "list/list.h" 当我在编译文件 prodcons 上运行 gdb 时,我收到消息“未找到调试符号” 编译后的fifo 文件也是如此。根据file 命令,两个文件都没有被剥离。

文件结构:

.
├── list
│   ├── list.c
│   ├── list.h
│   ├── main.c
│   └── Makefile
├── makefile
├── prodcons.c

.o 文件和二进制文件被排除在外。

以下是制作文件: 列表/生成文件: 全部:fifo liblist.a

OBJS = list.o main.o 
LIBS= -lpthread

fifo: ${OBJS}
    gcc -o $@ ${OBJS} ${LIBS} -ggdb

liblist.a: list.o
    ar rcs liblist.a list.o

clean:
    rm -rf *o fifo

./makefile:

prodcons: prodcons.o 
    gcc -g -static -Wall -I./list -L./list -o $@ prodcons.o -llist -lpthread

clean:
    @@rm prodcons prodcons.o

那么,有哪位大师准备好施展他们的魔法了吗? :)

【问题讨论】:

  • gcc 和 gdb 有哪些版本?
  • 最终可执行文件 (fifo) 的行正在通过 -ggdb,但它在那里不是很有用,因为它是链接步骤。调试信息是在每个编译单元的编译步骤生成的。编译 list.o 和 main.o 时(从 list.c 和 main.c),看起来它们没有传递 -ggdb,因此没有生成调试信息。一个选项是定义 CFLAGS="-ggdb -O0" (启用优化的调试是一种......奇怪的体验)。 %.c -> %.o 的默认构建规则将选择 CFLAGS 并将标志传递给所有编译单元。 prodcons 也是如此。
  • 如果您仍然没有得到调试符号,请检查nm --debug-syms your_executables_name 的输出。另请参阅nm。
  • 只需将 CFLAGS 添加到 list/Makefile 即可解决两个可执行文件的问题。不知道我明白了,但谢谢。你应该让你的评论成为答案。
  • 主教:gdb 7.6.1-1,gcc 4.8.2-3。

标签: debugging gcc gdb debug-symbols


【解决方案1】:

您应该首先使用-g 选项编译库,然后将 .o 文件链接到库中,如下所示:

list.o: list.c
     gcc -c -g list.c -o fax.o
liblist.a: list.o
     ar rcs liblist.a list.o

使用这个静态库编译其他的。

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2015-04-27
    • 1970-01-01
    • 2018-06-19
    • 2015-01-16
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多