2012-11-15 30 views
0

我想打一个make文件我使用Flex词法分析器,我试图使文件的许多模板,但它没有工作,所以请帮助我建立一个在这里是行编译代码:如何为词法分析器创建makefile?

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

你有什么错误? – iabdalkader

回答

2

的一个起点将是

LEX = lex 

.l.c: 
     $(LEX) -t $< >[email protected] 

.c.o: 
     $(CC) -o [email protected] -c $< 

lexy: lexical.o 
     $(CC) -o [email protected] $^ -ll 

这需要与clean规则,依赖性跟踪等进行扩展,但我认为你应该能够得到的想法如何Makefile文件的工作。

+0

与上面的答案相比有什么不同 – flashdisk

8

如果你使用的是GNU,你根本不需要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) [email protected] 
    $(LEX.l) $< > [email protected] 

它的确如此。以类似的方式,您可以检查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 

Voilà!因此,您的makefile文件最短可能为

LDLIBS=-ll 
all: lexical 
+0

我不明白最终的make文件应该是什么? – flashdisk

+0

我的答案的两个最后一行。 – Jan

+0

当我运行make命令时,我得到以下信息:〜/ hedor1> make make:***没有指定目标,也没有找到makefile。停止。 – flashdisk

2

GNU make已经为此定义了必要的规则。只要把这个在名为Makefile

LDLIBS = -ll 

lexy: lexical.o 

lexical.o: lexical.l 

文件并运行

$使

就大功告成了。