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

May*_*tBe 0 make

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

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

例如,在终端中的顺序是这样的:

flex test.l
Run Code Online (Sandbox Code Playgroud)

这将创建文件 lex.yy.c

然后我编译:

g++ lex.yy.c -ll -o test
Run Code Online (Sandbox Code Playgroud)

Makefile 逆向读取:

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

lex.yy.c: test.l
     flex test.l
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ith 8

Makefile 遵循此格式(Makefile 应始终使用制表符而不是空格,因为它在 的大多数(如果不是全部)实现中是必需的make):

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

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

  • 测试
  • lex.yy.c

由于lex.yy.c是 build 所需的依赖项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 被建造。

附加信息:有关生成文件的更多信息,我建议Linux开发平台Rafeeq乌尔拉赫曼第 4 章:使用 GNU Make

  • @MayNotBe 目标在生成文件中出现的顺序无关紧要,重要的是您拥有正确的目标及其依赖项。 (3认同)