2013-11-04 159 views
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 

因此,任何大師在那裏,隨時準備執行他們的魔法? :)

+0

哪個版本的gcc和gdb? – bishop

+3

最終可執行文件(fifo)的行正在越過-ggdb,但它並不是非常有用,因爲它是鏈接步驟。調試信息在每個編譯單元的編譯步驟中生成。當編譯list.o和main.o(從list.c和main.c)時,它看起來像沒有傳遞-ggdb,所以不會生成調試信息。一個選項是定義CFLAGS =「 - ggdb -O0」(啓用優化的調試是一種......奇怪的體驗)。 %.c - >%.o的默認構建規則將選取CFLAGS並將標誌傳遞給所有編譯單元。同樣適用於prodcons。 – simark

+0

如果你還沒有得到調試符號,請檢查'nm --debug-syms your_executables_name'的輸出。另見[nm](http://en.wikipedia.org/wiki/Nm_%28Unix%29)。 – Ali

回答

0

您應該先-g選項編譯的lib,然後.o文件將鏈接到圖書館,不知何故像這樣:

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

使用這種靜態庫編譯他人。