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 목록/메이크 : 여기
은 메이크 파일입니다 그들의 마술? :)
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