2013-11-04 5 views
1

gcc에서 디버깅 기호를 생성하지 않는 이상한 문제가 발생하여 도움이됩니다.라이브러리로 컴파일 할 때 gcc에 디버그 기호가 포함되지 않습니다.

나는 아마 여기 바보 같은 짓을하고있다.하지만 나는 -g 나 -ggdb를 잊어 버리지 않았고, 거기에 -s도 붙이지 않았다. 정보는 다음과 같습니다.

나는 list라는 정적 라이브러리 (학교 과제 임)와이를 포함하는 두 가지 프로그램이 있습니다. 내가 컴파일 된 파일 prodcons에 GDB를 실행하면 #include "list/list.h"로 prodcons에, 그것은 내가 메시지 "에는 디버깅 심볼을 찾을 수 없습니다"얻을 포함되어있는 반면, 목록, #include "list.h"으로 포함되어 있습니다 (fifo로 컴파일) 주에서

같은 간다 컴파일 된 파일은 fifo입니다. file 명령에 따라 파일은 제거되지 않습니다.

파일 구조 :

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

.o 인 파일과 바이너리는 명확성을 위해 제외.

prodcons: prodcons.o 
    gcc -g -static -Wall -I./list -L./list -o [email protected] prodcons.o -llist -lpthread 

clean: 
    @@rm prodcons prodcons.o 

그래서, 준비 거기에 어떤 전문가가 수행 할 : 모든 :

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이 liblist.a FIFO 목록/메이크 : 여기

은 메이크 파일입니다 그들의 마술? :)

+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 

이 정적 lib 디렉토리가 다른 사람을 컴파일 할 때 사용합니다.