我想使用flex为我的词法分析器制作一个make文件,我已经尝试过很多make文件的模板,但它没有用,所以请帮我构建一个这里是编译代码的行:
lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc -o lexy lexical.o -ll
答案 0 :(得分:7)
如果您正在使用GNU make,则根本不需要makefile。内置规则涵盖了您的使用案例。
让我们打印内置规则,看看make是否知道如何将'%。l'转换为'%。c'。
$ make -p | grep -A6 '\.l\.c'
make: *** No targets specified and no makefile found. Stop.
.l.c:
# Implicit rule search has not been done.
# Modification time never checked.
# File has not been updated.
# recipe to execute (built-in):
@$(RM) $@
$(LEX.l) $< > $@
确实如此。以类似的方式,您可以检查GNU make是否知道如何从'%。c'构建'%。o'和从'%.o'构建'%'可执行文件。
假设当前目录中有lexical.l
并且没有makefile,那么让我们看看如何构建lexical
。
$ make -n lexical
rm -f lexical.c
lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc lexical.o -o lexical
rm lexical.c lexical.o
大。我们所遗漏的只是您要求链接的-ll
标志。我们将其添加到LDLIBS
。
$ make -n lexical LDLIBS=-ll
rm -f lexical.c
lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc lexical.o -ll -o lexical
rm lexical.c lexical.o
瞧!因此,您的makefile可以与
一样短LDLIBS=-ll
all: lexical
答案 1 :(得分:2)
起点是
LEX = lex
.l.c:
$(LEX) -t $< >$@
.c.o:
$(CC) -o $@ -c $<
lexy: lexical.o
$(CC) -o $@ $^ -ll
这需要使用clean
规则,依赖关系跟踪等进行扩展,但我认为您应该能够了解Makefile的工作原理。
答案 2 :(得分:1)
GNU make已经为此定义了必要的规则。只需将其放在名为Makefile
LDLIBS = -ll
lexy: lexical.o
lexical.o: lexical.l
并运行
$ make
你已经完成了。