У меня есть полу-большой проект, который я пытаюсь отладить, и по какой-то причине 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 ».
Поэтому у меня есть два вопроса:
(не важно) Есть ли способ собрать каждый источник самостоятельно, но заставить их перекомпилировать с новыми вариантами, когда другое правило компиляции выбирается макияж ,
(очень важно, пожалуйста, помогите!) Почему gdb не может видеть мои другие исходные файлы и что я могу сделать, чтобы загрузить их?
'отладки: CFLAGS + = $ (BASE_CFLAGS) $ (BASE_LIBS) -g -DDEBUG_MODE' - это действительно работает ? Я бы подумал, что это просто заставит целевую «отладку» зависеть от всех этих (несуществующих) файлов. – immibis
Да, это называется назначением переменной для конкретной цели. Я нашел это очень полезным: https://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html – LambdaBeta
@ n.m. «Есть еще одна особенность целевых переменных: когда вы определяете целевую переменную, значение переменной также действует для всех предпосылок этой цели и всех их предпосылок и т. Д.». – immibis