请解释一下当我运行这个 Makefile 时会发生什么

请解释一下当我运行这个 Makefile 时会发生什么

我正在学习 flex 和(真正的第一次)使用命令行。

我创建了一个 Makefile 来简化我的测试过程,但我不明白为什么命令是相反的。

例如,在终端中的顺序如下:

flex test.l

这将创建文件lex.yy.c

然后我编译:

g++ lex.yy.c -ll -o test

Makefile 倒着读:

test: lex.yy.c
     g++ lex.yy.c -ll -o test

lex.yy.c: test.l
     flex test.l

那么当我跑步时具体会发生什么make

答案1

Makefile 遵循这种格式(Makefile 应始终使用制表符而不是空格,因为大多数(如果不是全部)实现都需要它make):

target: dependencies
    operations to build target
  • 目标是您愿意构建/编译/创建的内容。可能有几个,并且应该按照 Makefile 顺序构建它们,除非需要首先满足依赖关系。这第一的文件中的目标称为默认目标,这就是make当您不带参数调用它时尝试构建的内容。
  • 依赖项是构建目标所需的不同部分。

在此 Makefile 中,您有两个目标:

  • 测试
  • lex.yy.c

由于lex.yy.c是构建 所需的依赖项test,因此将首先从 构建test.l。一旦生成,就可以编译了test。基本上,make... :

  • 尝试构建test.
  • 未解决的依赖性。lex.yy.c不存在(或已更新),需要先构建。
  • 读取操作来构建lex.yy.c。运行flex test.llex.yy.c已构建。
  • test满足所有依赖关系。跑步g++ lex.yy.c -ll -o test
  • test被建造。

附加信息:有关 makefile 的更多信息,我建议Linux开发平台经过拉菲克·乌尔·雷曼第 4 章:使用 GNU Make

答案2

首先使调用成为目标test,但lex.yy.c它是一个依赖项。

因此,在真正执行之前,请分析您的目标和所有依赖项。第一个目标是test,但在开始执行它之前lex.yy.c被调用。

相关内容