Makefile中的:=和=有什么区别?


Answers:


76

这在GNU Make文档的标题为6.2变量的两种风格 的部分中进行了描述。

简而言之,用定义的变量将:=被扩展一次,但是用定义的变量将在使用时=被扩展。


4
因此,说:=更有效是正确的吗?还是效率不是Makefiles真正考虑的因素?
Ungeheuer

3
@Ungeheuer这不是问题,因为进程调用(此make主任务)的开销比内部变量解析要大得多。
基里尔·布林金

62

简单分配 :=

一个简单的赋值表达式在第一次出现时仅被评估一次。例如,如果CC :=${GCC} ${FLAGS}在第一次相遇期间评估为,gcc -W则每次${CC}发生时都将替换为gcc -W

递归分配 =

每次在代码中遇到变量时,都会评估递归赋值表达式。例如,CC = ${GCC} {FLAGS}仅当${CC} file.c执行like之类的动作时,才会对like之类的语句进行评估。然而,如果变量GCC被重新分配,即 GCC=c++那么${CC}将被转换为c++ -W重新分配之后。

条件分配 ?=

条件赋值仅在没有值的情况下才将值赋给变量

追加中 +=

假设CC = gcc再追加运算符用于像CC += -w
那么CC现在拥有价值gcc -W

有关更多信息,请查看这些教程


“一个简单的赋值表达式在第一次出现时仅被评估一次”:要清楚,扩展/评估是在定义变量时进行的,而不是在首次使用时进行的。
Michael Burr

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.