理解Makefile:变量中的变量与递归扩展

需积分: 50 401 下载量 156 浏览量 更新于2024-08-10 收藏 964KB PDF 举报
"变量中的变量-算法引论:一种创造性方法---高清版" 在Makefile编程中,变量的使用是至关重要的。变量允许我们存储和复用配置信息,提高代码的可读性和可维护性。本资源主要探讨了两种在Makefile中定义变量的机制以及它们的优缺点。 首先,介绍的是基本的赋值方式,即使用等号“=”进行赋值。这种方式允许我们用已有的变量值来构建新的变量。例如: ```makefile foo = $(bar) bar = $(ugh) ugh = Huh? ``` 在这个例子中,`foo`的最终值将是`Huh?`,因为Makefile会递归地解析变量。虽然这种递归赋值在某些场景下是有用的,例如延迟变量的计算,如`CFLAGS = $(include_dirs) -O`,其中`include_dirs`可以在稍后定义。然而,它也存在风险,比如可能导致无限递归(如`A = $(B)`和`B = $(A)`),并且当在变量值中使用函数(如`wildcard`和`shell`)时,可能会导致性能问题和不可预测的结果。 为了避免这些问题,Makefile提供了另一种赋值操作符“:=”,也称为即时赋值或静态赋值。使用“:=”时,变量的值会在赋值时立即计算,而不是在使用时展开。这有助于避免无限递归和性能问题,例如: ```makefile CFLAGS := $(include_dirs) -O include_dirs := -Ifoo -Ibar ``` 在这种情况下,`CFLAGS`的值将只计算一次,不会因`include_dirs`的改变而改变。 Makefile的编写还包括了许多其他方面,如规则的定义、目标的编译和链接、自动推导依赖性、使用通配符、伪目标、多目标、静态模式规则等。此外,Makefile还支持条件判断和函数调用,提供了丰富的字符串和文件名处理功能,增强了Makefile的灵活性和功能性。 理解并熟练掌握Makefile中的变量用法是编写高效Makefile的关键,这有助于构建自动化构建流程,简化复杂的项目构建过程。通过合理使用变量、条件语句和函数,开发者能够编写出更加智能和适应性强的Makefile脚本。