为什么不是';当我执行make时,即使我在makefile中编写了make,也没有a-g选项(gdb)

为什么不是';当我执行make时,即使我在makefile中编写了make,也没有a-g选项(gdb),makefile,gdb,Makefile,Gdb,我正在为我的小项目编写一个makefile,下面是我的makefile: CC=gcc CFLAGS=-I. DEPS = parse.h y.tab.h OBJ = y.tab.o lex.yy.o parse.o FLAGS = -g -Wall LDFLAGS = -lpthread default:all all: lisod lex.yy.c: lexer.l flex $^ y.tab.c: parser.y yacc -d $^ %.o: %.c $(D

我正在为我的小项目编写一个makefile,下面是我的makefile:

CC=gcc
CFLAGS=-I.
DEPS = parse.h y.tab.h
OBJ = y.tab.o lex.yy.o parse.o 
FLAGS = -g -Wall
LDFLAGS = -lpthread

default:all

all: lisod

lex.yy.c: lexer.l
    flex $^

y.tab.c: parser.y
    yacc -d $^

%.o: %.c $(DEPS)
    $(CC) $(FLAGS)  -c -o $@ $< $(CFLAGS)
example: $(OBJ) example.o
    $(CC) -o $@ $^ $(CFLAGS)

lisod: lisod.o csapp.o $(OBJ)   $(LDFLAGS) 
    $(CC) -o $@ $^ $(CFLAGS) $(FLAGS)
# hello:
#   echo hello
clean:
    rm -f *~ *.o example lex.yy.c y.tab.c y.tab.h lisod

但当我执行make时,似乎没有-g选项,因此我无法使用gdb进行调试

如果仔细查看您的输出,您会发现问题并不在于
-g
标志,而是您提供的模式规则根本没有被使用。
-I.
选项首先出现,而不是最后出现,这一事实证明了这一点

您得到的是从相应的.c文件生成.o文件的默认规则。当两者都适用时,您提供的规则将覆盖内置规则,但在
make
的分析中,您的模式规则并不(始终)适用,因为它指定了可能最初不存在且没有生成规则的先决条件(至少
y.tab.h
)。(请参见GNU Make手册中的。)

事实上,您在使用
make
的世界模型时遇到了一个经典问题:它没有非常清晰地处理生成多个输出的配方,这些输出是其他规则的先决条件。您可能会对它感兴趣,它主要在一致性
make
实现中进行了一般性讨论,并提供了一系列越来越复杂(越来越灵活)的规则。这种简单的模式被推荐为“在大多数情况下已足够”:


在这种特殊情况下,您可以使用一个模式规则,它确实理解多个输出文件:
%.tab.h%.tab.c:parser.%;yacc-d$Thank@MadScientist,我以前没有意识到模式规则的细节。我已经更新了这个答案以包含这些信息。虽然我不完全理解,但它确实有效,谢谢!
gcc -I.   -c -o lisod.o lisod.c
gcc -I.   -c -o csapp.o csapp.c
y.tab.c: parser.y
    yacc -d $^

# Add this, so make knows where y.tab.h comes from:
y.tab.h: y.tab.c

# I assume that parse.h is an ordinary source, not a generated one

%.o: %.c $(DEPS)
    $(CC) $(CFLAGS) $(FLAGS) -c -o $@ $<
%.tab.c %.tab.h : parser.%
    yacc -d $^

%.o: %.c $(DEPS)
    $(CC) $(CFLAGS) $(FLAGS) -c -o $@ $<