创建一个makefile

时间:2012-11-30 04:53:49

标签: c makefile

所以我必须创建一个生成下面描述的应用程序的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

1 个答案:

答案 0 :(得分:2)

你必须告诉make有关依赖项。例如,lex.yy.c取决于spec.l:

lex.yy.c: spec.l
    flex spec.l

第一行说lex.yy.c取决于spec.l。第二部分讲述了当lex.yy.c较新时如何生成spec.l的更新版本。我们几乎用其他文件重复该模式。在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中指定的第一个目标,因此您通常希望首先使用最终可执行文件进行排列,然后将其他目标排列在其后:< / p>

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

...在make文件的开头。然后调用编译器的行将使用它,如:

lex.yy.o: lex.yy.c spec.tab.h
    $(cc) $(cflags) -c lex.yy.c

当执行此操作时,cflags宏将被展开,因此执行的命令是gcc -O2 -c lex.yy.c(并且它预定义cc到它通常期望的编译器的名称使用,因此Microsoft的make将其设置为cl,将GNU设置为gcc等。)