由于makefile导致GDB没有看到除main之外的源文件?

时间:2016-03-10 04:20:05

标签: c debugging makefile

我有一个半大项目,我正在尝试调试,出于某种原因,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;。

因此我有两个问题:

  1. (不是很重要)有没有办法独立编译每个源,但在make中选择了不同的编译规则时,强制使用新选项重新编译它们。

  2. (非常重要,请帮助!)为什么gdb不能看到我的其他源文件,我该怎么办才能加载它们?

1 个答案:

答案 0 :(得分:0)

可以使用makemake -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)