Makefile 中:= ?= += =的区别(摘自https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html)

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验

新建一个Makefile,内容为:
ifdef DEFINE_VRE
    VRE = “Hello World!”
else
endif

ifeq ($(OPT),define)
    VRE ?= “Hello World! First!”
endif

ifeq ($(OPT),add)
    VRE += “Kelly!”
endif

ifeq ($(OPT),recover)
    VRE := “Hello World! Again!”
endif

all:
    @echo $(VRE)

敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo
            y = $(x) bar
            x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo
            y := $(x) bar
            x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

编译安卓的一些知识点相关推荐

  1. 解释型语言与编译型的必须知识点

    解释型语言与编译型的必须知识点 概念: 计算机不能理解直接理解高级语言,只能理解机器语言,所以必须把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译的方式有两种: 编译 解释 两种翻译 ...

  2. mac下编译安卓源码

    资源 Mac OS10.12 编译Android源码8.1 aosp编译-需翻墙 Mac下编译安卓源码 手把手教你在Mac OS下载.编译及导入Android源码 步骤 准备 磁盘空间大于180G 安 ...

  3. 关于编译安卓kernel出现“make[1]:***[init/main.o] error 1”的解决办法

    编译安卓内核的时候,出现这个错误,花了好长时间才找到答案. 执行 sudo dpkg-reconfigure dash 选择no,然后继续编译就不会出现错误了.

  4. Ubuntu 18.04安装openJDK7编译安卓6.0.0_r1

    最近在使用AOSP编译安卓6.0.0_r1源码,自己的机器是Ubuntu18.04 TLS,试了网上所有安装openjdk7的教程发现没有一个可以使用的,实属无奈只能自己动手解决这个问题完成了编译,教 ...

  5. 编译安卓系统源码jack-server问题入坑,全网最全解决方法

    编译安卓系统源码jack-server入坑,全网最全解决方法 1.权限问题 2.端口占用 3.删除 TLSv1, TLSv1.1(我的最后解决办法) 1.权限问题 运行失败时进入~/.jack-ser ...

  6. uniapp-条件编译安卓Android/苹果iOS

    uniapp-条件编译安卓Android/苹果iOS //在全局common.js定义 module.exports = {is_iOS: function() {if (uni.getSystemI ...

  7. 高通sdm660平台编译安卓10

    编译安卓10源码 在源码根目录执行 环境初始化 source build/envsetup.sh 可以使用lunch,查看当前有哪些板级编译选项 lunch 完整编译 ./build.sh dist ...

  8. 从零开始编译安卓系统源码(生成.img文件)以及安卓系统内核

    最近开始接触安卓设备,了解到安卓系统开机界面以及定制桌面需要修改系统源码,这种情况下就需要重新编译系统源码得到.img镜像文件,本篇文章记录从零开始编译安卓系统源码以及安卓系统内核的一种方式. 很感谢 ...

  9. React Native系列(6) - 编译安卓私有React-Native代码

    为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...

最新文章

  1. 关于举办第十五届全国大学生智能汽车竞赛浙江赛区选拔赛的通知(草案)
  2. 十分钟教你开发EOS智能合约
  3. 数据库---闭包习题
  4. 推荐几款不错的写作利器
  5. JavaWeb学习之路——SpringBoot 中几种异常处理方法(四)
  6. arm 架构_Arm架构之Arm内核解析
  7. 两点(51nod 深搜)
  8. 在linux下使用ftp客户端命令
  9. 数字电路实验 04 - | 组合逻辑电路的设计与测试
  10. el table 固定表头和首行_el-table 固定表头
  11. 三层交换技术与链路聚合
  12. 【奋斗人生】心得日记(20191112至20191230)
  13. Android ApiDemos示例解析(110):Views-Data Widgets-1. Dialog
  14. 披着“云”衣裳的狗——搜狗输入法“云”版本尝鲜记
  15. 局域网内即时通信软件 ZSCQ -工作进度记录表
  16. BSC 再现闪电贷攻击 BUNNY 闪崩
  17. Exceptions In Java
  18. php如何做md5签名,MD5数字签名算法:生成签名和验签(附代码)
  19. 中科院oracle,《Oracle 10G 系统教程 中科院培训老师讲授》
  20. 导出mysql表数据到文件

热门文章

  1. linux云管理,教程|云帮手部署Linux公有云管理系统
  2. python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...
  3. perl python文本处理_awk, python, perl文本处理效率对比(zz)
  4. linux shell的二级菜单,linux shell编程之菜单选择(一)
  5. java创建数组大小为n_如何通过提供大小在Kotlin中创建一个像Java一样的数组?
  6. Linux 端口占用解决
  7. 五、数据对象和属性类型
  8. 维度爆炸?Python实现数据压缩竟如此简单!
  9. 如何在 Windows 上安装 Python | Linux 中国
  10. 《中餐厅》弹幕数据分析,我不要你觉得,我只要我觉得!