C GDB不';看不到main以外的源文件,这是由makefile引起的吗?
我有一个正在调试的半大型项目,出于某种原因,gdb只愿意显示C GDB不';看不到main以外的源文件,这是由makefile引起的吗?,c,debugging,makefile,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:.
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)
这显然比我的新解决方案效率低,但它确实有一些优势。首先,我不必在每个主编译和调试编译之间运行makeclean
(实际上,我总共有8种不同的编译规则,因此必须在它们中的大多数之间进行清理,以便使用新选项重新编译各个源代码是一件痛苦的事情)。第二,也是最重要的一点,当我运行调试编译时,GDB能够看到所有的源文件。现在,正如我所说,它只能看到main.c,并将其余部分列为“没有名为???.c的源文件”
因此,我有两个问题:
根据要生成
main.out
文件还是debug.out
文件,可以使用make
或make-Ddebug
调用以下makefile
注意:
需要在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 $@ $(LFLAGS)
#Compilation rules for objects
%.o:%.c %.h
<tab>$(CC) $(CFLAGS) $< -o $@
.PHONY : clean
clean:
<tab>$(RM) $(OBJECTS)
CC:=/usr/lib/gcc
RM:=/usr/lib/RM
ifndef调试
目标:=main.out
调试信息:=
其他的
目标:=debug.out
debugInfo:=-g-DDEBUG\u模式
恩迪夫
#加载所需的源文件
标题=$(通配符*.h)$(通配符subdir/*.h)
SOURCES=$(标题:.h=.c)
对象=$(源:.c=.o)
#每个编译类型的标志
CFLAGS+=$(debugInfo)-c-Wall-Wextra-Wconversion-std=gnu99
冒牌货:全部
全部:$(目标)
$(目标):$(对象)
$(CC)$(debugInfo)$^-o$@$(LFLAGS)
#对象的编译规则
%.o:%.c%.h
$(CC)$(CFLAGS)$<-o$@
.假冒:干净
清洁:
$(RM)$(对象)
可以使用make
或make-Ddebug
调用以下makefile,具体取决于您是要生成main.out
文件还是debug.out
文件
注意:
需要在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 $@ $(LFLAGS)
#Compilation rules for objects
%.o:%.c %.h
<tab>$(CC) $(CFLAGS) $< -o $@
.PHONY : clean
clean:
<tab>$(RM) $(OBJECTS)
CC:=/usr/lib/gcc
RM:=/usr/lib/RM
ifndef调试
目标:=main.out
调试信息:=
其他的
目标:=debug.out
debugInfo:=-g-DDEBUG\u模式
恩迪夫
#加载所需的源文件
标题=$(通配符*.h)$(通配符subdir/*.h)
SOURCES=$(标题:.h=.c)
对象=$(源:.c=.o)
#每个编译类型的标志
CFLAGS+=$(debugInfo)-c-Wall-Wextra-Wconversion-std=gnu99
冒牌货:全部
全部:$(目标)
$(目标):$(对象)
$(CC)$(debugInfo)$^-o$@$(LFLAGS)
#对象的编译规则
%.o:%.c%.h
$(CC)$(CFLAGS)$<-o$@
.假冒:干净
清洁:
$(RM)$(对象)
debug:CFLAGS+=$(BASE\u CFLAGS)$(BASE\u LIBS)-g-DDEBUG\u模式
-这实际有效吗?我认为这只会使目标“debug”依赖于所有这些(不存在的)文件。是的,它被称为目标特定变量赋值。我发现它非常有用:@n.m.“目标特定变量还有一个特殊特性:当您定义一个目标特定变量时,该变量值对该目标的所有先决条件及其所有先决条件等都有效。”以$(CC)
开头的行应该缩进吗?@immibis-hm,的确,错过了。debug:CFLAGS+=$(BASE\u CFLAGS)$(BASE\u LIBS)-g-DDEBUG\u模式
-这真的有效吗?我认为这只会使目标“debug”依赖于所有这些(不存在的)文件。是的,它被称为目标特定变量赋值。我发现它非常有用:@n.m.“目标特定变量还有一个特殊特性:当您定义一个目标特定变量时,该变量值对该目标的所有先决条件及其所有先决条件等都有效。”以$(CC)
开头的行应该缩进吗?@immibis-hm,的确,错过了。