请问makefile ?= 与 := 区别
时间: 2023-10-06 14:11:01 浏览: 219
在 Makefile 中,`?=` 和 `:=` 是两个不同的变量赋值运算符。
`?=` 是条件赋值运算符,它会在变量未定义或为空时进行赋值。如果变量已经有值,那么 `?=` 不会改变它的值。例如:
```makefile
foo ?= bar
```
如果 `foo` 未定义或为空,那么它将被赋值为 "bar"。
而 `:=` 是简单的赋值运算符,它会直接将右侧的值赋给变量。例如:
```makefile
foo := bar
```
无论变量 `foo` 是否已被定义,它都将被赋值为 "bar"。
需要注意的是,`?=` 和 `:=` 的区别在于赋值时机。`?=` 是在使用变量时才进行赋值,而 `:=` 是在 Makefile 解析时立即进行赋值。因此,使用 `:=` 可以避免在后续使用变量时不符合预期的情况。
相关问题
makefile中的 = ?= :=
在Makefile中,=是最普通的等号赋值符号,它的作用是将右侧的值赋给左侧的变量。例如,变量A=1,表示将1赋值给变量A。
?=是条件赋值符号,它的作用是只有在变量未定义时才进行赋值。例如,如果变量A未定义,A?=1,那么A的值就是1;如果A已经定义了,那么A?=1就不会起作用,A的值保持不变。
:=是简单赋值符号,它的特点是变量的值决定于它在Makefile中的位置,而不是整个Makefile展开后的最终值。这意味着,如果在使用:=进行赋值时,变量的右侧包含了其他变量的引用,那么这些变量的值将在赋值时被解析并赋给左侧的变量。
总结一下:
- =是最普通的等号赋值符号,将右侧的值赋给左侧的变量。
- ?=是条件赋值符号,只有在变量未定义时才进行赋值。
- :=是简单赋值符号,变量的值决定于它在Makefile中的位置,而不是整个Makefile展开后的最终值。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [Makefile 中:= ?= += =的区别](https://blog.csdn.net/chenzhen1080/article/details/107135390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [Makefile 中 = := ?= += 的使用及区别](https://blog.csdn.net/shenfengchen/article/details/110792431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
makefile中=和:=区别
在Makefile中,`=` 和 `:=` 是赋值操作符,它们的区别在于处理变量的方式:
1. `=` (等于):这是一个基本的赋值操作符,在遇到第一个 `=` 之前,如果目标变量已经被定义过,那么之前的值会被覆盖。也就是说,它会删除原有的值,然后插入新的值。例如:
```makefile
FOO = bar
FOO = baz
```
这将把 `FOO` 的值设为 `baz`,而之前 `bar` 的值就被忽略了。
2. `:=` (等同于):这个操作符是所谓的“隐含赋值”,它不会检查变量是否已经存在。如果变量不存在,它会直接创建并赋值;如果已经存在,就会保留原值不变。这种方式通常用于设置默认值。例如:
```makefile
FOO ?= bar
```
如果 `FOO` 变量尚未设置,`?=` 会让 `FOO` 等价于 `bar`。如果 `FOO` 已经有值,`?=` 就不会改变它的值。
总的来说,如果你希望总是替换已存在的变量值,使用 `=`;如果你想确保原有值不变,并提供默认值,就使用 `:=`。另外,`:=` 更加安全,因为它不会意外地清除已有的变量。
阅读全文