首页 > 其他分享 >makefile =和:=的区别

makefile =和:=的区别

时间:2024-03-15 11:57:25浏览次数:19  
标签:VAR1 变量 区别 VAR2 makefile VALUE VIR 赋值

makefile =和:=的区别

  1. “=”
    “=”是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用”=”进行赋值,变量的值是整个makefile中最后被指定的值。不太容易理解,举个例子如下:
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA

最终VIR_B的值是AAB,因为=是所有展开最后的结果,没有先后顺序,

  1. “:=”
    相比于前面“最普通”的”=”,”:=”就容易理解多了。”:=”就表示直接赋值,赋予当前位置的值。同样举个例子说明
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA

:=是立即赋值,所以VIR_B等于AB,VIR_A这个时候还不等于AA

抱歉,我之前的回答确实说反了。在 Makefile 中,=:= 确实有不同的行为,这里是正确的解释:

  1. =(延迟扩展赋值):
    使用 = 进行赋值时,变量的值会在使用时进行扩展。这意味着在定义变量时,它不会立即计算变量值中的变量引用,而是将这些变量引用保留到实际使用变量时才进行替换。

    variable = $(value)
    

    如果 value 变量在定义 variable 时尚未定义,$(value) 将保持为一个待扩展的变量,直到它被实际使用时才会进行替换。

  2. :=(即时扩展赋值):
    使用 := 进行赋值时,变量的值会在赋值时立即进行扩展。这意味着在定义变量时,它将立即计算变量值中的变量引用,并替换为相应的值。

    variable := $(value)
    

    如果 value 变量在定义 variable 时尚未定义,$(value) 将被替换为一个空字符串,而不是保留为一个待扩展的变量。

AI回答:

以下是一个示例来说明两者的区别:

# 假设 VALUE 未定义
VAR1 = $(VALUE)
VAR2 := $(VALUE)

# 稍后定义 VALUE
VALUE = somevalue

all:
    # 输出 VAR1 和 VAR2 的值
    @echo VAR1 is $(VAR1)
    @echo VAR2 is $(VAR2)

在这个例子中,VAR1 将被赋值为空字符串,因为 $(VALUE) 在定义 VAR1 时未定义。而 VAR2 将在定义时立即扩展,所以它也将被赋值为空字符串。当 VALUE 被定义为 somevalue 后,VAR1 保持为空字符串,而 VAR2 将变为 somevalue。因此,all 目标的输出将是:

VAR1 is 
VAR2 is somevalue

标签:VAR1,变量,区别,VAR2,makefile,VALUE,VIR,赋值
From: https://www.cnblogs.com/codedingzhen/p/18075102

相关文章

  • numpy中random.seed()与random.RandomState()的区别
    1.random.seed()用处:初始化随机数生成器。设置随机数生成器种子后,直接生成随机数即可,无需在随机数生成器条件下运行。2.random.RandomState()作用:获得随机数生成器 比较上面两图可以看出,获取随机数生成器之后,必须在此条件下运行,才可生成相同的随机数,若不在此条件下运行,随......
  • vue2与vue3的区别
     vue2和vue3双向数据绑定原理发生了改变vue2的双向数据绑定是利用了es5的一个APIObject.definepropert()对数据进行劫持结合发布订阅模式来实现的。vue3中使用了es6的proxyAPI对数据进行处理。1.vue2和vue3双向数据绑定原理发生了改变相比与vue2,使用proxyAPI优势有:de......
  • 拦截器和过滤器(原理&区别)
    目录一、拦截器拦截器是什么拦截器的使用拦截器的实现导入依赖实现HandlerInterceptor接口注册拦截器拦截器的生命周期拦截器的执行顺序拦截器的生命周期多个拦截器的执行流程拦截器的实际使用拦截器实现日志记录实现接口幂等性校验拦截器的性能优化二、过滤器......
  • Maven 中<optional>true</optional>和<scope>provided</scope>之间的区别(转)
    原文:https://segmentfault.com/a/1190000019266080?utm_source=tag-newest<optional>true</optional>和<scope>provided</scope>有什么区别呢?从语义来上理解optional可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。scopeprovided提供的,可以理解为此......
  • 一张图搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!
    写在开头在线程的生命周期中,不同状态之间切换时,可以通过调用sleep()、wait()、join()、yield()等方法进行线程状态控制,针对这一部分知识点,面试官们也会做做文章,比如问你这些方法的作用以及之间的区别。那么今天我们就一起来总结一下这几个方法的作用及区别,先画一个思维导图梳理一......
  • RAM和ROM的区别
    RAM(RandomAccessMemory)和ROM(Read-OnlyMemory)是计算机中两种不同类型的存储器,具有不同的特性和用途。易失性vs.非易失性:RAM:RAM是一种易失性存储器,意味着它在断电时会丢失存储的数据。RAM用于存储正在运行的程序和临时数据,因为其读写速度快,但一旦电源断开,其中的数据就会......
  • PEST和SWOT分析的区别与联系
    PEST和SWOT分析的区别与联系1.什么是SWOT分析?SWOT的四个字母分别代表着项目内部和外部的四个关键因素:优势(Strengths):项目的竞争优势。劣势(Weaknesses):内部存在的劣势,相对于竞争对手而言。机会(Opportunities):当前可利用的外部机会。威胁(Threats):可能导致问题并对项目产生负面影......
  • C# Dictionary与List的用法区别与联系
    原文链接:https://blog.csdn.net/qq_22120623/article/details/134280660C#是一门广泛应用于软件开发的编程语言,其中Dictionary和List是两种常用的集合类型。它们在存储和操作数据时有着不同的特点和用途。本文将详细探讨C#Dictionary和List的用法区别与联系,并通过代码示例进行对......
  • ubuntu下软件安装工具apt和apt-get的区别
    1、apt命令的引入Ubuntu16.04发布时,一个引人注目的新特性便是apt命令的引入。其实早在2014年,apt命令就已经发布了第一个稳定版,只是直到2016年的Ubuntu16.04系统发布时才开始引人关注。随着aptinstallpackage命令的使用频率和普遍性逐步超过apt-getinstallpac......
  • 分布式事务Seata中的XA和AT区别,通俗易懂!
    首先得知道二个概念:1、CAP理论CAP是指在分布式系统下,系统包含C、A、P三个要素,并且三者不可兼得。C: 一致性:同一个数据在同一时刻是相同的A: 可用性:即系统出错误,但在一定时间范围内仍能够正确的响应用户请求P: 分区容错性:即某节点或网络分区故障时,系统仍能够提供......