Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GDB不';看不到main以外的源文件,这是由makefile引起的吗?_C_Debugging_Makefile - Fatal编程技术网

C GDB不';看不到main以外的源文件,这是由makefile引起的吗?

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:.

我有一个正在调试的半大型项目,出于某种原因,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)
这显然比我的新解决方案效率低,但它确实有一些优势。首先,我不必在每个主编译和调试编译之间运行
makeclean
(实际上,我总共有8种不同的编译规则,因此必须在它们中的大多数之间进行清理,以便使用新选项重新编译各个源代码是一件痛苦的事情)。第二,也是最重要的一点,当我运行调试编译时,GDB能够看到所有的源文件。现在,正如我所说,它只能看到main.c,并将其余部分列为“没有名为???.c的源文件”

因此,我有两个问题:

  • (不太重要)有没有一种方法可以独立编译每个源代码,但在make中选择不同的编译规则时,强制使用新选项重新编译它们

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


  • 根据要生成
    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,的确,错过了。