我正在学习 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.l
:lex.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
被调用。