因此,我必须创建一个makefile来生成下面描述的应用程序,并确保每个生成的文件都有自己的规则。
对于makefile:第一个工具是flex,它获取一个名为spec.l的文件并生成一个名为lex.yy.c的文件。另一个名为bison的工具需要一个文件calledspec.y,并将生成文件spec.tab.c。如果使用指令-vd调用bison,它还将生成一个名为spec.tab.h的文件(编译lex.yy.c时需要该文件)。这两个C文件可以编译成目标文件,然后与yacc (-ly)和lex (-ll)库链接在一起,以生成编译器(a.out.如果您仅从spec.l和spec.y开始,则您描述的makefile必须生成以下命令:
flex spec.l
bison -vd spec.y
gcc -c lex.yy.c
gcc -c spec.tab.c
gcc spec.tab.o lex.yy.o -ly -ll我不知道从哪里开始解决这个问题。
编辑:到目前为止我所拥有的
compiler: spec.tab.o lex.yy.o
gcc spec.tab.o lex.yy.o -ly –ll
lex.yy.c: spec.l
flex spec.l
spec.tab.c: spec.y
bison -vd spec.y
spec.tab.o: spec.tab.c
gcc -c spec.tab.c
lex.yy.o: lex.yy.c spec.tab.h
gcc –c lex.yy.c
clean:
rm –f *.c *.o a.out发布于 2012-11-30 13:08:53
你必须告诉制造商关于依赖关系的事情。例如,lex.yy.c依赖于spec.l:
lex.yy.c: spec.l
flex spec.l第一行说明lex.yy.c依赖于spec.l。第二部分讲述了当spec.l较新时如何生成lex.yy.c的更新版本。我们在其他文件中几乎重复了这个模式。在calledspec.y的情况下,我们有两个结果,这两个结果是由相同的输入/命令产生的。至少在GNU make中,您可以这样指定:
spec.tab.c spec.tab.h: calledspec.y
bison -vd calledspec.y然后对.o (或.obj等)的依赖项重复该过程。头文件和C文件:
lex.yy.o: lex.yy.c spec.tab.h
$(cc) -c lex.yy.c最后注意一点:除非您另有指定,否则make将构建makefile中指定的第一个目标,因此您通常希望首先使用最终的可执行文件来安排它,然后再安排其他目标:
parser: lex.yy.o y.tab.o
$(cc) -o parser lex.yy.o y.tab.o
lex.yy.o: lex.yy.c spec.tab.h
$(cc) -c lex.yy.c诸若此类。这只适用于目标,而不适用于宏,因此您通常会看到以下几种情况:
cflags = -O2...at生成文件的开头。然后调用编译器的行将使用该代码,如下所示:
lex.yy.o: lex.yy.c spec.tab.h
$(cc) $(cflags) -c lex.yy.c当这段代码被执行时,cflags宏将被展开,因此被执行的命令是gcc -O2 -c lex.yy.c (它将cc预定义为它通常期望使用的编译器的名称,因此微软的make将其设置为cl,将其设置为gcc,依此类推)。
https://stackoverflow.com/questions/13639230
复制相似问题