Makefile中=, :=, ?=和+=的含义

  • 1. 含义
    • 1.1 " = "
    • 1.2 " := "
    • 1.3 " ?= "
    • 1.4 " += "
  • 2. 实例

  在Makefile语法中,时不时会见到各种“=”号的赋值语句,除了常见的“=”和“:=”,还有“?=”等

  那么这些赋值等号分别表示什么含义呢?

1. 含义

1.1 " = "

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

    VIR_X = foo
    VIR_Y = $(VIR_X) bar
    VIR_X = xyz
    

经过上面的赋值后,最后VIR_Y的值是xyz bar,而不是foo bar。在make时,会把整个makefile展开,拉通决定变量的值

1.2 " := "

  • 相比于前面“最普通”的“=”,“:=”就容易理解多了。“:=”就表示直接赋值,赋予当前位置的值。同样举个例子说明

    VIR_X := foo
    VIR_Y := $(VIR_X) bar
    VIR_X := xyz
    

最后变量VIR_Y的值是foo bar,即根据当前位置进行赋值。因此相比于“=”,“:=”才是真正意义上的直接赋值。

1.3 " ?= "

  • “?=”表示如果该变量没有被赋值,则赋予等号后的值。举例:

    VIR ?= new_value
    

    如果VIR在之前没有被赋值,那么VIR的值就为new_value.

    VIR := old_value
    VIR ?= new_value
    

    这种情况下,VIR的值就是old_value

1.4 " += "

  • “+=”和平时写代码的理解是一样的,表示将等号后面的值添加到前面的变量上。举例:

    VIR = foo
    VIR += bar
    

    最后结果为foobar.

2. 实例

我们来做个简单的实验,新建一个Makefile,内容为:

ifdef DEFINE_VREVRE = “Hello World!”
else
endififeq ($(OPT),define)VRE ?= “Hello World! First!”
endififeq ($(OPT),add)VRE += “Kelly!”
endififeq ($(OPT),recover)VRE := “Hello World! Again!”
endifall:@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. Makefile中.PHONY的含义

    目录标题 含义 作用 说明 含义 单词phony (即phoney)的意思是:伪造的,假的. 在Makefile中, .PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的 ...

  2. Makefile中 变量赋值含义

    From:  http://hi.baidu.com/linuxking/item/aab87527ac88550a76272c91 作者联系方式:李先静 <xianjimli at hotma ...

  3. makefile中 -j16的含义

    make -j 用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源. 因此 ...

  4. makefile中一些符号的含义

    先标注一个很好的makefile教程 这里归纳了如下符号的含义,请对号入座如下 $@, $^, $<, $?和=, +=, :=, ?=和:\ 和 $, $$和% section1:(自动化变量 ...

  5. Makefile中常用的函数

     常用函数调用 语法: $(<function> <arguments>)或 ${<function><arguments>} <functi ...

  6. makefile中变量有哪些?

    make一些参数选项: -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于–debug=a,b(basic),v(ver ...

  7. Linux makefile中的= := ?=操作符

    在Linux的makefile中,可以使用=,:=,?=赋值语句,但是它们的含义是不同的.下面分别说明: = 是变量在使用的时候才真正的把值赋给它,也就是说延迟赋值. := 即时赋值,不会等到真正使用 ...

  8. Makefile中的变量

    Makefile中的变量 2007-11-03 12:03 Makefile中变量有以下几个特征: 1. Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取make ...

  9. Makefile中支持的函数大全

    From: http://blog.chinaunix.net/uid-25365622-id-3056374.html 一.描述 Makefile的函数调用,很像变量的使用,也是以"$&q ...

最新文章

  1. Visual Studio视觉编程工具(推荐四个)
  2. ROS Gazebo(二):概述
  3. mybatis工具类
  4. POJ 3635 Full Tank?
  5. Java如何以及为什么使用Unsafe?
  6. 狗窝里的小日子- 8 ...
  7. 001_docker-compose构建elk环境
  8. 解决libreadline.so.6: cannot open shared object file: No such file or directory的问题
  9. 如何写好 Java 业务代码?这也是有很多规范的!
  10. python文件都是脚本吗_.py文件是python脚本吗
  11. 多角度SAR图像匹配
  12. IMDB排名前100名经典电影
  13. 《缠中说禅108课》44:小级别背驰引发大级别转折
  14. 济南公积金 销户 提取
  15. Bayes,HMM,MRF Gibbs Distribution在图像降噪中的应用
  16. 装逼必备:大型分布式网站术语分析
  17. 一本通1527欧拉回路
  18. SAP官网学习教程(2)创建HANA数据库
  19. Linux嵌入式基础知识
  20. 根据城市名称检索城市ID,以及省市县(LitePal+RxJava+Retrofit)

热门文章

  1. 使用AFNetWorking请求错误
  2. php中单引号双引号那点事---顺便说说把php变量的值传给js
  3. 批量出售QQ群idcnd传媒提供
  4. 有C++/C的java学习
  5. 【智能车竞赛】状态机编程在智能车竞速赛道中的应用 - 编程小记
  6. MySQL自然连接删除重复列的问题
  7. Visual Studio 2019 下载地址
  8. 负数时的有符号整型和无符号整型的转换
  9. 使用PPT将图片背景透明化
  10. f460root密码,f460 超级密码