如何为词法分析器创建makefile?

时间:2012-11-15 09:48:54

标签: c makefile lex lexical-analysis

我想使用flex为我的词法分析器制作一个make文件,我已经尝试过很多make文件的模板,但它没有用,所以请帮我构建一个这里是编译代码的行:

lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc -o lexy lexical.o -ll

3 个答案:

答案 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

你已经完成了。