gpt4 book ai didi

c++ - Makefile:无事可做

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:18 25 4
gpt4 key购买 nike

我正在使用 Bison 和 Flex 构建一个解析器。为了编译所有内容,我使用了一个简单的 makefile。但是,我不是创建 makefile 的专家。 makefile 可以正常工作,除了以下几点:

makefile 未检测到更改 file.cpp 中的源代码。无事可做。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 "$@"

%.o: %.cpp
$(CC) $(CFLAGS) -c "$<" -o "$@"

clean:
rm -rf $(OBJECTS) $(EXECUTABLE) parser/parser.cpp parser/parser.hpp scanner/scanner.cpp

最佳答案

file.cpp 作为要构建的 cpp 文件的依赖项。当您更改 file.cpp 时,这将使 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.ypp $(FILES)
bison -d parser.ypp

lex.yy.c: parser.l parser.tab.hpp $(FILES)
flex parser.l

parser: $(OBJS) $(FILES)
$(CC) $(CFLAGS) $(OBJS) $(FILES) -o $(EXECUTABLE)

clean:
rm -rf *o $(EXECUTABLE) $(OBJS)

关于c++ - Makefile:无事可做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com