0

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

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

3 回答 3

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当前目录中有 a 并且没有 makefile 让我们看看如何 make build 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
于 2012-11-15T10:06:39.970 回答
2

一个起点是

LEX = lex

.l.c:
        $(LEX) -t $< >$@

.c.o:
        $(CC) -o $@ -c $<

lexy: lexical.o
        $(CC) -o $@ $^ -ll

这需要通过clean规则、依赖跟踪等进行扩展,但我认为您应该能够了解 Makefile 的工作原理。

于 2012-11-15T10:06:04.283 回答
1

GNU make 已经为此定义了必要的规则。只需将它放在一个名为Makefile

LDLIBS = -ll

lexy: lexical.o

lexical.o: lexical.l

并运行

$ 制作

你就完成了。

于 2012-11-15T12:18:26.517 回答