我想使用 flex 为我的词法分析器制作一个 make 文件,我尝试了许多 make 文件的模板,但它没有工作,所以请帮我建立一个这里是编译代码的行:
lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc -o lexy lexical.o -ll
我想使用 flex 为我的词法分析器制作一个 make 文件,我尝试了许多 make 文件的模板,但它没有工作,所以请帮我建立一个这里是编译代码的行:
lex -t lexical.l > lexical.c
cc -c -o lexical.o lexical.c
cc -o lexy lexical.o -ll
如果您使用 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
一个起点是
LEX = lex
.l.c:
$(LEX) -t $< >$@
.c.o:
$(CC) -o $@ -c $<
lexy: lexical.o
$(CC) -o $@ $^ -ll
这需要通过clean
规则、依赖跟踪等进行扩展,但我认为您应该能够了解 Makefile 的工作原理。
GNU make 已经为此定义了必要的规则。只需将它放在一个名为Makefile
LDLIBS = -ll
lexy: lexical.o
lexical.o: lexical.l
并运行
$ 制作
你就完成了。