Makefile错误,无法解析include

时间:2014-01-05 00:55:35

标签: makefile gnu-make

我正在使用flex / bison的项目,并尝试使用make编译它。 flex / bison中的lex.yy.c,tab.c,tab.h正确生成并放在obj目录中。但是,尝试编译obj / lex.yy.c文件时出错,并且无法将include解析为src / frontend目录中的文件。我出错的任何想法? Makefile和输出包含在下面。

生成文件:

VPATH = src obj src/frontend src/interpreter
SRCS = lex.yy.c C.tab.c symbol_table.c nodes.c print_ast.c interpreter.c main.c
OBJS := $(SRCS:%.c=obj/%.o)
INCLUDES = -Isrc -Iobj -Isrc/frontend -Isrc/interpreter
CPPFLAGS = -Wall
LDFLAGS = -Wall
CC = gcc
LEX = flex
YACC = bison -d -t -v

all: bin/mycc

bin/mycc: $(OBJS)
    $(CC) -g $(LDFLAGS) $(INCLUDES) -o $@ $^

obj/lex.yy.c: C.flex obj/C.tab.h
    $(LEX) -o $@ $<

obj/C.tab.c: C.y
    $(YACC) -o $@ $<

obj/C.tab.h: obj/C.tab.c
    @touch $@

obj/%.o: src/%.c
    $(CC) -g $(CPPFLAGS) $(INCLUDES) -c $^

clean: 
    rm $(OBJS) obj/lex.yy.c obj/C.tab.c obj/C.tab.h

depend: 
    $(CC) -M $(SRCS) > .deps
    cat Makefile .deps > makefile

输出:

bison -d -t -v -o obj/C.tab.c src/frontend/C.y
src/frontend/C.y: conflicts: 4 shift/reduce, 14 reduce/reduce
src/frontend/C.y:248.11-53: warning: rule useless in parser due to conflicts: external_declaration: function_definition
flex -o obj/lex.yy.c src/frontend/C.flex
gcc  -Wall  -c -o obj/lex.yy.o obj/lex.yy.c
src/frontend/C.flex:13:19: fatal error: token.h: No such file or directory
 #include "token.h"
               ^
compilation terminated.
make: *** [obj/lex.yy.o] Error 1

1 个答案:

答案 0 :(得分:1)

问题是您定义了-I标志,以便在变量$(INCLUDES)中而不是在普通$(CPPFLAGS)中进行编译。因此,当运行编译C文件的默认规则时,它不会使用任何这些-I标志,因此编译器无法找到包含文件。您可以在输出中看到编译器的命令行。

要解决此问题,请删除INCLUDES =行并将其全部添加到CPPFLAGS

CPPFLAGS = -Wall -Isrc -Iobj -Isrc/frontend -Isrc/interpreter