我正在使用Bison和Flex構建解析器。編譯一切我使用一個簡單的makefile。但是,我不是創建makefile的專家。生成文件正在工作,但幾件事情除外:Makefile:無法完成
更改源文件file.cpp中未檢測到生成文件。 沒有事可做。 A make clean
解決了這個問題,但是這當然不是必須的。我發現了很多makefile教程,但沒有討論這類問題。
CC=g++
CFLAGS=-Wall -std=c++11 -ll
EXECUTABLE=parser
OBJS=parser.tab.cpp lex.yy.c
FILES= file.cpp
all: parser
parser.tab.cpp parser.tab.hpp: parser.ypp
bison -d parser.ypp
lex.yy.c: parser.l parser.tab.hpp
flex parser.l
parser: $(OBJS) $(FILES)
$(CC) $(CFLAGS) $(OBJS) $(FILES) -o $(EXECUTABLE)
clean:
rm -rf *o $(EXECUTABLE) $(OBJS)
當然,我可以用make -B all
,然後我還發現一些奇怪的事情:
bison -d parser.ypp
bison -d parser.ypp
flex parser.l
g++ -Wall -std=c++11 -ll parser.tab.cpp lex.yy.c file.cpp -o parser
爲什麼bison -d parser.ypp
做兩次?
[解決]
我們現在下面的Makefile使用:
CC = g++
CFLAGS = --std=c++0x -O2
SOURCES = $(wildcard */*.cpp *.cpp) parser/parser.cpp
OBJECTS = $(SOURCES:.cpp=.o) scanner/scanner.o parser/parser.o
EXECUTABLE = calculator
all: parser/parser.cpp scanner/scanner.cpp $(EXECUTABLE)
parser/parser.cpp:
cd parser && bison -d -o parser.cpp grammar.ypp && cd ..
scanner/scanner.cpp: parser/parser.hpp
cd scanner && flex -o scanner.cpp lexer.l && cd ..
$(EXECUTABLE): $(OBJECTS)
$(CC) $^ -o "[email protected]"
%.o: %.cpp
$(CC) $(CFLAGS) -c "$<" -o "[email protected]"
clean:
rm -rf $(OBJECTS) $(EXECUTABLE) parser/parser.cpp parser/parser.hpp scanner/scanner.cpp
爲什麼你想讓lex.yy.c作爲改變file.cpp的結果被重建? –