创建一个生成文件

标签 c 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

最佳答案

您必须将相关性告知 make。例如,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

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

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,等等)

关于创建一个生成文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13639230/

相关文章:

c++ - 段错误和内存泄漏

c - 在 C : function that sums items in array returning weird large number

c - C 中的语法 else if

c - C中将字符串赋值给字符指针的解释

c - Makefile 中的自动变量未正确扩展

java - 在java项目中使用cmake时出现"package xxx.util does not exist"错误

c - 在 Windows 10 上构建此代码的正确方法是什么?

c - 如何在C中将IP4和IP6地址转换为长值?

c++ - 如何在 CMake 中使用 PJSIP 库?

c - 链接器错误 :/usr/bin/ld: cannot find -lc