为什么不是';当我执行make时,即使我在makefile中编写了make,也没有a-g选项(gdb)
我正在为我的小项目编写一个makefile,下面是我的makefile:为什么不是';当我执行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
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 $@ $<