2016-03-10 3 views
1

У меня есть полу-большой проект, который я пытаюсь отладить, и по какой-то причине gdb только хочет показать исходный код файла main.c и отказывается перечислить любой из других файлов.GDB не видит исходные файлы, кроме основного, вызванные make-файлом?

Вот соответствующие строки в моем Makefile:

DEFINES= #... 
BASE_CFLAGS= #... 
BASE_LIBS= #... 

#Load the required source files 
HEADERS=$(wildcard *.h) $(wildcard subdir/*.h) 
SOURCES=$(HEADERS:.h=.c) 
OBJECTS=$(SOURCES:.c=.o) 

#Flags for each compilation type 
CFLAGS=-Wall $(DEFINES) 
main: CFLAGS+=$(BASE_CFLAGS) $(BASE_LIBS) 
debug: CFLAGS+=$(BASE_CFLAGS) $(BASE_LIBS) -g -DDEBUG_MODE 

#Compilation rules for objects 
%.o: %.c %.h 
$(CC) -c $(CFLAGS) $< -o [email protected] 

#main compilation 
main:$(OBJECTS) main.c 
    $(CC) main.c $(OBJECTS) $(CFLAGS) -o ../main.out 

#debug compilation 
debug:$(OBJECTS) main.c 
    $(CC) main.c $(OBJECTS) $(CFLAGS) -o ../debug.out 

clean: 
    rm $(OBJECTS) 

По какой-то причине, когда я бегу make debug затем попытаться отлаживать полученный вывод он действует так, как будто main.c единственный файл скомпилирован с -g флагом, даже если Я заранее запустил make clean и проверил вывод make, чтобы он скомпилировал каждый объект с флагом -g.

До моего последнего изменения я был Makefile, который выглядел примерно так:

DEFINES= #... 
BASE_CFLAGS= #... 
BASE_LIBS= #... 

#Load the required source files 
HEADERS=$(wildcard *.h) $(wildcard subdir/*.h) 
SOURCES=$(HEADERS:.h=.c) 
OBJECTS=$(SOURCES:.c=.o) 

#main compilation 
main:$(SOURCES) main.c 
    $(CC) $(SOURCES) main.c -Wall $(DEFINES) $(BASE_CFLAGS) $(BASE_LIBS) -o ../main.out 

#debug compilation 
debug:$(SOURCES) main.c 
    $(CC) $(SOURCES) main.c -Wall $(DEFINES) $(BASE_CFLAGS) $(BASE_LIBS) -g -DDEBUG_MODE -o ../debug.out 

который был явно менее эффективным, чем мое новое решение, но это действительно было несколько преимуществ. Во-первых, мне не нужно было запускать make clean между каждой основной и отладочной компиляцией (на самом деле у меня есть в общей сложности 8 различных правил компиляции, поэтому для очистки между большинством из них для перекомпиляции отдельных источников с новыми параметрами возникает боль). Во-вторых, и самое главное, GDB смог увидеть все исходные файлы, когда я запустил компиляцию отладки. Теперь, как я уже сказал, он может видеть только main.c и перечисляет остальные как «Нет исходного файла с именем« .c ».

Поэтому у меня есть два вопроса:

  1. (не важно) Есть ли способ собрать каждый источник самостоятельно, но заставить их перекомпилировать с новыми вариантами, когда другое правило компиляции выбирается макияж ,

  2. (очень важно, пожалуйста, помогите!) Почему gdb не может видеть мои другие исходные файлы и что я могу сделать, чтобы загрузить их?

+0

'отладки: CFLAGS + = $ (BASE_CFLAGS) $ (BASE_LIBS) -g -DDEBUG_MODE' - это действительно работает ? Я бы подумал, что это просто заставит целевую «отладку» зависеть от всех этих (несуществующих) файлов. – immibis

+1

Да, это называется назначением переменной для конкретной цели. Я нашел это очень полезным: https://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html – LambdaBeta

+0

@ n.m. «Есть еще одна особенность целевых переменных: когда вы определяете целевую переменную, значение переменной также действует для всех предпосылок этой цели и всех их предпосылок и т. Д.». – immibis

ответ

0

следующий Makefile может быть вызван с make или make -Ddebug в зависимости от того, если вы хотите, чтобы произвести main.out файл или файл debug.out.

Примечание: <tab> нужно будет заменить фактической закладке полукокса в вашем Makefile

CC := /usr/lib/gcc 
RM := /usr/lib/rm 

ifndef debug 
target := main.out 
debugInfo := 
else 
target := debug.out 
debugInfo := -g -DDEBUG_MODE 
endif 

#Load the required source files 
HEADERS=$(wildcard *.h) $(wildcard subdir/*.h) 
SOURCES=$(HEADERS:.h=.c) 
OBJECTS=$(SOURCES:.c=.o) 

#Flags for each compilation type 
CFLAGS+= $(debugInfo) -c -Wall -Wextra -Wconversion -std=gnu99 

.PHONY : all 
all : $(TARGET) 

$(TARGET):$(OBJECTS) 
<tab>$(CC) $(debugInfo) $^ -o [email protected] $(LFLAGS) 

#Compilation rules for objects 
%.o:%.c %.h 
<tab>$(CC) $(CFLAGS) $< -o [email protected] 

.PHONY : clean 
clean: 
<tab>$(RM) $(OBJECTS) 
Смежные вопросы