1
我遇到了一個gcc沒有生成調試符號的奇怪問題,真的很感謝一些幫助。當然,我可能在這裏做了一些愚蠢的事情,但我還沒有忘記-g或-ggdb,而且我還沒有在那裏偷過一個-s。這裏是信息:gcc在編譯庫時不包含調試符號
我有一個名爲列表(這是一個學校作業),和兩個程序包括它在不同的方式靜態庫。
在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文件和二進制文件排除清晰度。
下面是make文件: 列表/ Makefile文件: 所有:FIFO liblist.a
OBJS = list.o main.o
LIBS= -lpthread
fifo: ${OBJS}
gcc -o [email protected] ${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 [email protected] prodcons.o -llist -lpthread
clean:
@@rm prodcons prodcons.o
因此,任何大師在那裏,隨時準備執行他們的魔法? :)
哪個版本的gcc和gdb? – bishop
最終可執行文件(fifo)的行正在越過-ggdb,但它並不是非常有用,因爲它是鏈接步驟。調試信息在每個編譯單元的編譯步驟中生成。當編譯list.o和main.o(從list.c和main.c)時,它看起來像沒有傳遞-ggdb,所以不會生成調試信息。一個選項是定義CFLAGS =「 - ggdb -O0」(啓用優化的調試是一種......奇怪的體驗)。 %.c - >%.o的默認構建規則將選取CFLAGS並將標誌傳遞給所有編譯單元。同樣適用於prodcons。 – simark
如果你還沒有得到調試符號,請檢查'nm --debug-syms your_executables_name'的輸出。另見[nm](http://en.wikipedia.org/wiki/Nm_%28Unix%29)。 – Ali