Make文件中赋值等号的几种类型(:=,?=,=)

2023-05-16

今天有一位以前仅做过Android APP开发的同学突然间问我,说Makefile中经常可以看见:冒号等号(:=)、问号等号(?=)和直接等号(=)。这究竟有什么区别呢?
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu
突然想到团队中其实有些同学以前没有做过Android整个源码树或者native代码的修改和开发,因此对Makefile有些陌生。这里简单的介绍一下三者的区别,其实非常简单:
1) ?=: 条件赋值(conditional variable assignment),如果变量已经赋值,则不要重新赋值;
2) :=: 立即赋值(immediately assignment),变量取值立即展开;
3) =: 递归展开赋值(recursively expanded assignment),该变量在使用的时候才对表达式进行展开;
对于后面的2)、3),稍微难以理解一点,但是只要我给出下面的表达式大家立即就会理解了:
VAR1 = $VAR2 + postfix
对头,区别就是如果变量的表达式中包含另外的变量如何处理。立即赋值立刻取值展开,以后VAR1和VAR2就没有关系了;递归展开赋值在后面使用VAR1的时候才真正根据VAR2的取值来计算,
如果期间VAR2的取值发生变换,VAR1的取值也是变化的。
下面看几个例子加深理解:
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu
1. ?= 
这个非常简单,就是说符号已经定义,就不要进行赋值。
P = hello
P ?= byebye
TARGET:
        @echo $(P)


$ make
hello
这里看出,P并没有赋值为byebye,因为它已经有值了。
2. := 和 = 赋值
这两个赋值的区别在于如果表达式中包含其他的变量,那其他变量展开的时机。
:= 在赋值的时候就展开,以后不再变化;
= 在使用的时候展开,如果赋值和使用之间右部变量发生改变,则取值发生变化;
<pre name="code" class="plain">P = hello
A := $(P)
B = $(P)
P = byebye
TARGET:
        @echo $(A)
        @echo $(B)

  

$ make
hello
byebye


这里看出,P取值发生改变后,A的取之并没有重新eval,而B在使用的时候,使用的是最新的P。
为了便于喜欢研究的同学深究,我特意上传makefile的宝典pdf文件供大家下载:
http://download.csdn.net/detail/howellzhu/8392153
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Make文件中赋值等号的几种类型(:=,?=,=) 的相关文章

  • Qt之make: Nothing to be done for ‘first‘

    今天在修改了pro cpp h等文件 xff0c 重新编译时 xff0c 出现了标题所示的内容 如下图1所示 和同事讨论了一下 xff0c 主要有几个问题 xff0c 可能导致make不成功 1 xff09 工程文件内容没有变化 xff0c
  • catkin_make报错

    catkin make报错 xff1a CMake Error at CMakeLists txt 1 Parse error Expected a span class token builtin class name command s
  • make -C和M=的作用

    当make的目标为all时 xff0c C KDIR 指明跳转到源码目录下读取那里的Makefile xff1b M 61 PWD 表明然后返回到当前目录继续读入 执行当前的Makefile
  • make: warning:  Clock skew detected.  Your build may be incomplete.

    这种问题一般是从一个设备拷贝到另一个设备上 xff0c 编译出现问题 xff1a 这种问题的原因是时钟偏差导致的 xff0c 就是检测到两个设备系统之间的时间上存在差距 xff1a 解决方案 xff1a find type f xargs
  • 关于 make_unique 和 make_shared

    C 43 43 14 才加入make unique xff0c 据说当时忘记实现了 那么C 43 43 11 可以自己实现这个功能 xff1a template lt typename T typename Args gt std uniq
  • make和cmake命令

    我们在安装Ubuntu软件时 xff0c 有时我们会用到make和cmake命令 所以在这篇文章我们来讲解一下 xff0c make命令和cmake命令他们的作用 xff0c 以及什么关系和区别 首先假设你有一定的计算机基础 xff0c 能
  • ROS编译(catkin_make):Unable to find either executable ‘empy‘ or Python module ‘em‘ 错误解决

    CMake Error at opt ros noetic share catkin cmake empy cmake 30 message Unable to find either executable 39 empy 39 or Py
  • 转:make cmake和catkin_make的区别

    程序在cmake编译是这样的流程 cmake指令依据你的CMakeLists txt 文件 生成makefiles文件 make再依据此makefiles文件编译链接生成可执行文件 catkin make是将cmake与make的编译方式做
  • Liunx下源代码安装&&make&&makefile

    Linux下安装软件的方式分为源代码安装和二进制安装 源代码安装 xff0c 即使用应用程序源代码进行编译安装二进制安装 xff0c 例如red hat发行的 rpm包 debian发行的 deb包 源代码安装 用c语言为例 include
  • cmake, make, CMakeLists.txt, Makefile简介

    文章目录 cmake make CMakeList txt Makefile之间的关系参考文章链接 xff1a 转自个人博客 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt M
  • No rule to make target错误解决方案

    报错 xff1a No rule to make target My Wall Paper2 img png needed by debug qrc resource cpp Stop 解决方案 xff1a 把 qrc文件删了新建一个res
  • gcc、make、makefile、cmake、cmakelists区别

    转自 xff1a http www zhihu com question 36609459 辉常哥 1 gcc是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器
  • cmake与make的区别及CMakeLists.txt文件编写

    一 cmake与make的区别 make工具是一个自动化编译工具 xff0c 它会根据Makefile中的规则进行批处理编译 当需要编译的文件较多时 xff0c 使用make工具会大大提高效率 但是 xff0c 当项目较大时 xff0c 编
  • make和cmake

    编程人员已经使用CMake和Make很长一段时间了 当你加入一家大公司或者开始在一个具有大量代码的工程上开展工作时 xff0c 你需要注意所有的构建 你需要看到处跳转的 CMakeLists txt 文件 你应该会在终端使用 cmake 和
  • 如何实现make工具的降版本?

    为什么要降make版本 因为编译MTK 平台的Android source code报错 而且是莫名奇妙的错误 困扰很久 一 问题背景 Ubuntu 15 04以上的make版本都已经是4 0 官方目前推荐的编译环境还是基于Ubuntu 1
  • Windows下配置cygwin/cmake

    对于那些低配置的电脑 要在windows做一些简单的coding work 安装一个VS实在有些转不开 所以我首先想到了通过cygwin cmake配置一个简单的开发环境 对于我那台老旧的IBM T43完全没问题 1 安装cygwin 首先
  • 从零开始学习makefile(4)makefile中%、$@、$<、$^的作用

    目录 示例 头文件fun h main cpp fun cpp makefile 与 lt 是通配符 https www quora com What does o cpp in a Makefile mean是这样描述 的作用的 for
  • 如何在基于 Debian 的系统上从源代码安装 Wine

    作为 Windows 程序的狂热用户 您可能会发现有时需要在 Ubuntu 系统上使用特定程序 尽管还有其他选项 例如虚拟机或 Wine 等程序 它有助于在 Linux 上运行 Windows 程序 但它们涉及一些工作 而且并不是运行这些程
  • Linux下Make编译结果输出到文件

    Linux系统下执行make命令 编译比较大一点的工程或者文件的时候 在命令行下错误和警告信息直接就把我们的实现覆盖了 把编译日志输出到文件是个选择 执行如下命令即可达到目的 make gt build log 2 gt 1
  • Cmake的使用

    简介 CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 特性 类似UNIX下的automake 只是 CMake 的

随机推荐

  • Python数据分析之--运动员数据揭秘(一)

    在网易云课堂看了城市数据团的课程 xff0c 对理解利用pytthon进行数据分析的基本流程很有帮助 xff0c 因此进行复盘总结 xff0c 加深自己的理解 xff0c 巩固相关操作 分析资料及工具 xff1a Spyder Python
  • 缓慢变化维

    一 什么是缓慢变化维 xff1f 缓慢变化维 xff08 Slowly Changing Dimensions SCD xff09 它的提出是因为在现实世界中 xff0c 维度的属性并不是静态的 xff0c 它会随着时间的流失发生缓慢的变化
  • 一个小例子带你入门-Tableau

    声明 xff1a 本文是学习W3Cschool教程整理所得 xff0c 非原创 xff0c 原文链接 xff1a W3Cschool 创建任何Tableau数据分析报告涉及三个基本步骤 连接到数据源 它涉及定位数据并使用适当类型的连接来读取
  • SQL 必知必会--函数篇

    对SQL的基础函数做复习回顾 xff0c 本篇涉及的函数知识如下 xff1a 好了 xff0c 下面开始复习 xff1a SQL Aggregate 函数计算从列中取得的值 xff0c 返回一个单一的 值 Max 函数 作用 xff1a 返
  • WPS的Linux Mint版(Ubuntu)提示“系统缺失字体”的解决方法

    wps的Linux Mint版 Ubuntu 版安装成功后 xff0c 可能每次启动的时候都会提示 xff1a 系统缺失字体 xff0c 如图 xff1a 解决方法 1 首先下载字体包并解压 链接 https pan baidu com s
  • SQL必知必会--中级篇(二)

    接上一篇SQL必知必会 中级篇 xff08 一 xff09 xff0c 继续对sql知识进行整理复习 本篇包含知识点如图 xff1a 一 SQL 约束 用于规定表中的数据规 则 xff1b 如果存在违反约束的数据行为 xff0c 行为会被约
  • 静态网页个人简历

    程序员的简历是不用随身带的 首先 xff0c 作为程序员自己的简历是比别人特别的 xff1b 程序员应该是有思想 xff0c 有高情商的手工艺人 作为程序员简历是随身带的代码 xff0c 用代码书写的简历就像是一份随身携带着的简历 xff0
  • CMake之CMakeLists.txt编写入门

    自定义变量 主要有隐式定义和显式定义两种 隐式定义的一个例子是PROJECT指令 xff0c 它会隐式的定义 lt projectname gt BINARY DIR和 lt projectname gt SOURCE DIR两个变量 xf
  • 照相机成像原理 数码相机的成像原理

    照相机成像原理 数码相机的成像原理 1 1 数码相机 的成像原理 当打开相机的电源开关后 xff0c 主控程序芯片开始检查整个相机 xff0c 确定各个部件是否处于可工作状态 如果一切正常 xff0c 相机将处于待命状态 xff1b 若某一
  • MySQL 单表查询

    创建数据库并插入数据 创建表 xff0c 数据类型请自行查询 CREATE TABLE fruits id INT NOT NULL sid INT NOT NULL NAME CHAR 255 NOT NULL price DECIMAL
  • react ant Design pro Umi 项目左上角icon不显示

    今天本地运行项目没有问题 xff0c 打包发到远端发现logo icon不显示了 然后找了找资料说 LayoutSettings 哪里logo用链接图片可以本地图片有时候会加载异常 解决方法 xff1a 找到 app tsx 加个logo
  • ZeroMQ发布-订阅模式的应用(C++)

    我使用的ZeroMQ版本是4 2 0 xff0c 应用的是其发布 订阅模式 应该知道的细节 xff1a PUB SUB套接字是慢连接 xff0c 你无法得知SUB是何时开始接收消息的 就算你先打开了SUB套接字 xff0c 后打开PUB发送
  • Ubuntu 问题记录(1)| 关于卸载以源码方式安装的库

    Ubuntu 使用源码安装 lib 后 xff0c 如果要卸载 xff0c 则在 lib build 路径下使用 sudo make uninstall 之后再用 sudo updatedb 更新一下 lib 库 xff0c 再使用 loc
  • 注意字符数组最后会自动加\0

    今天做了一道考研题 规定数组大小为200 但是我没注意到后尾需要加 0 后来果断没有A过去 很伤心 反复不断地尝试怎么都不行 后来经一位仁兄点拨 瞬间豁然 include lt iostream gt include lt cstdio g
  • 在TypeScript中使用parseInt()

    在使用angular写一些东西的时候 xff0c 需要用到parseInt 方法来将时间戳转换成时分秒 xx时 xx分 xx秒 的格式 xff0c 但是因为angular所使用的是Typescript xff0c 而 parseInt st
  • CAS6.2.x ~ 准备(1)

    前言 CAS 企业单点登录 xff0c 目前最新版本是6 2 x Apereo 的 Central Authentication Service xff0c 通常称为CAS CAS是用于web的企业多语言单点登录解决方案 xff0c 并试图
  • MySql 安装,root初始化密码设置

    MySQL下载地址 xff1a https dev mysql com downloads mysql 2 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下 我的解压目录是 C mysql 8 0 12 winx64 34
  • Python游戏项目--外星人入侵(一)

    一 安装Pygame 在终端输入 xff1a pip install user pygame 二 开始游戏项目 xff08 1 xff09 创建Pygame窗口及响应用户输入 创建一个名为alien invasion py 的文件 xff0
  • SpringSecurity OAuth2 获取Token端点TokenEndpoint、Token授权TokenGranter接口 详解

    1 前言 在 授权服务器是如何实现授权的呢 xff1f 中 xff0c 我们可以了解到服务端实现授权的流程 xff0c 同时知道 xff0c 当授权端点AuthorizationEndpoint生成授权码时 xff0c 就会重定向到客户端的
  • Make文件中赋值等号的几种类型(:=,?=,=)

    今天有一位以前仅做过Android APP开发的同学突然间问我 xff0c 说Makefile中经常可以看见 xff1a 冒号等号 61 问号等号 61 和直接等号 61 这究竟有什么区别呢 xff1f 欢迎转载 xff0c 但是请注明原出