我有一个半大项目,我正在尝试调试,出于某种原因,gdb只愿意显示main.c
文件的源代码,并拒绝列出任何其他文件。
以下是我的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 $@
#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
标志编译的唯一文件,即使我运行{{1}预先检查make的输出,以确保它使用make clean
标志编译每个对象。
在我最近的更改之前,我有一个看起来更像这样的Makefile:
-g
这显然不如我的新解决方案有效,但确实有一些优点。首先,我没有必要在每个主编译和调试编译之间运行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
(实际上我总共有8个不同的编译规则,因此必须在大多数编译规则之间进行清理以便重新编译各个源代码。新的选择很痛苦)。其次,最重要的是,当我运行调试编译时,GDB能够看到所有源文件。现在,正如我所说,它只能看到main.c并将其余部分列为&#34;没有源文件名为???。c&#34;。
因此我有两个问题:
(不是很重要)有没有办法独立编译每个源,但在make中选择了不同的编译规则时,强制使用新选项重新编译它们。
(非常重要,请帮助!)为什么gdb不能看到我的其他源文件,我该怎么办才能加载它们?
答案 0 :(得分:0)
可以使用make
或make -Ddebug
调用以下makefile,具体取决于您是要生成main.out
文件还是debug.out
文件。
注意:<tab>
需要替换为makefile中的实际tab char
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 $@ $(LFLAGS)
#Compilation rules for objects
%.o:%.c %.h
<tab>$(CC) $(CFLAGS) $< -o $@
.PHONY : clean
clean:
<tab>$(RM) $(OBJECTS)