首页 > 其他分享 >Makefile手册中"+=",":=","?="操作符的区别

Makefile手册中"+=",":=","?="操作符的区别

时间:2024-06-15 19:10:06浏览次数:20  
标签:bar 定义 Makefile 手册 展开式 操作符 variable 变量

目录

Makefile手册中"+=",":=","?="操作符的区别


1."?="操作符

在GNUmake中,有一个变量在之前没有被赋值的情况下才会对这个变量进行赋值的操作,被称为条件赋值操作符"?="。因此

FOO ?= bar

其等价于

ifeq ($(origin FOO), undefined)
FOO = bar
endif

含义:如果变量"FOO"在之前没有被定义,就对此变量赋值"bar",否则不改变它的值

2."+="操作符

通常,一个通用变量在定义之后的其他一个地方,可以对其值进行追加。这是非常有用的。我们可以在定义时(也可以不定义而直接追加)给它赋一个基本值,后续根据需要可随时对它的值进行追加(增加它的值)。在 Makefile 中使用"+="(追加方式)来实现对一个变量值的追加操作。因此

objects = main.o foo.o bar.o utils.o
objects += another.o

其等价于

objects = main.o foo.o bar.o utils.o
objects = main.o foo.o bar.o utils.o another.o

"+="操作符在不同的情况下,含义是不一样的

1.如果被追加值的变量之前没有定义,那么,“+=”会自动变成“=”,此变量就被定义为一个递归展开式的变量。如果之前存在这个变量定义,那么“+=”就继承之前定义时的变量风格。

2.直接展开式变量的追加过程:变量使用“:=”定义之后“+=”操作将会首先替换展开之前此变量的值,然后在末尾添加需要追加的值,并使用“:=”重新给此变量赋值。实际的过程像

下边那样:

variable := value
variable += more

就是:

variable := value
variable := $(variable) more

3.递归展开式变量的追加过程:一个变量使用“=”定义之后“+=”操作时不对之前此变量值中的任何引用进行替换展开,而是按照文本的扩展方式(之前等号右边的文本未发生变化)替换,尔后在末尾添加需要追加的值,并使用“=”给此变量重新赋值。实际的过程和上边的相类似:

variable = value
variable += more

就是:

temp = value
variable = $(temp) more

当然了,上边的过程并不会存在中间变量:“temp”,使用它的目的时方便描述。这种情况时如果“value”中存在某种引用,情况就有些不同了。看我们通常一个会用到的例子:

3.":="操作符

为了避免“递归展开式”变量即使用"="定义的变量存在的问题和不方便。GNU make 支持另外一种风格的变量,称为“直接展开”式。这种风格的变量使用":="定义。在使用":="定义变量时,变量值中对其他变量或者函数的引用在定义变量时被展开(对变量进行替换)所以变量被定义后就是一个实际需要的文本串,其中不再包含任何变量的引用。因此

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

其等价于

y := foo bar
x := later

和递归展开式变量不同:此风格变量在定义时就完成了对所引用变量和函数的展开,因此不能实现对其后定义变量的引用。如:

y := $(x) bar
x := later

其等价于

y := bar
x := later

由于变量"x"的定义出现在"y"定义之后。因此在"y"的定义中,"x"的值为空。"y"的值为"bar"而不是"later bar"。这一点也是直接展开式和递归展开式变量的不同点。

标签:bar,定义,Makefile,手册,展开式,操作符,variable,变量
From: https://www.cnblogs.com/cwp-home/p/18249621

相关文章

  • C++学习手册
    创建一份全面的C++学习手册是一个庞大的任务,但这里我可以为你提供一个基础的大纲和一些关键点,以帮助你开始学习C++。###C++学习手册大纲####第一部分:C++简介1.C++的历史与发展2.C++的特点3.C++的应用领域4.开发环境的搭建####第二部分:基础语法1.基本数据类型2......
  • Makefile Operation
    ########################################################################################filename:Makefile#author:[email protected]#data:2024/06/14#function:项目中采用Makefile#note:None#......
  • makefile和shell都怎么编写,举例说明
    Makefile和Shell脚本是两种不同的编程工具,它们各自有不同的用途和编写方式。MakefileMakefile是一种用于自动化编译的工具,它使用Makefile文件来定义编译规则。Makefile通常用于编译源代码,生成可执行文件或库文件。Makefile的基本结构包括目标(target)、依赖(dependencies)和命令(comm......
  • 编写一个.sh的脚本,然后通过 shell 脚本执行 Makefile 文件并把生成的可执行文件下载到
    要编写一个shell脚本来执行Makefile并下载生成的可执行文件到开发板,你需要确保开发板可以通过某种方式(如SSH、FTP、SCP等)访问。以下是一个简单的shell脚本示例,它使用scp命令将可执行文件从本地机器复制到开发板。假设你的开发板可以通过SSH访问,并且你已经配置了SSH密钥认证,这样你......
  • 编写一个 Makefile 文件,对阶段项目一的代码进行自动化编译
    为了编写一个Makefile文件来自动化编译一个项目,我们需要知道项目中包含哪些源文件以及它们是如何组织的。假设我们有一个简单的项目,它包含两个C源文件`main.c`和`helper.c`,以及一个头文件`helper.h`。我们希望编译这些文件生成一个名为`project`的可执行文件。以下是一个简单的M......
  • 【GD32F303红枫派使用手册】第十五节 USART-printf打印实验
    15.1实验内容通过本实验主要学习以下内容:串口简介GD32F303串口工作原理使用printf打印信息15.2实验原理15.2.1串口简介串口,从广义上看,指所有串行通信接口,比如RS232、RS422、RS485、SPI、IIC等。串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的通讯......
  • 简单的Makefile文件解析
    Makefile文件解析#commonmakefileheader#"$(变量)"、"$makefile内置变量"表示变量值DIR_INC=../../include #头文件相对路径DIR_BIN=../../bin #可执行文件的相对路径DIR_LIB=../../libs #库的相对路径TARGET =iat_online_record_sample #目标变量BIN_TA......
  • C# OpenCvSharp Mat操作-操作符重载
    在C#中使用OpenCvSharp进行图像处理时,操作符重载可以使代码更加简洁和直观。下面是对每个操作符的详细解释及示例代码。“+”运算符作用或原理:+运算符可以在Mat与Mat之间进行,也可以在Mat和一个数字之间进行加运算。使用加运算可以改变图像亮度,也可以实现两幅图像......
  • Oracle报错:“Error in invoking target ‘agent nmhs’ of makefile...”
    Oracle报错:“Errorininvokingtarget‘agentnmhs’ofmakefile...”  前言:Oracle在安装过程中的报错一定要重视,这决定你后续是否能完成安装以及是否能使用。我这边会陆续汇总一些报错现象以及解决方案共享。##InstallProduct86%报错信息:“Errorininvokingtarget'......
  • 【C++面向对象】重载操作符
    C++将运算符重载扩展到自定义的数据类型,它可以让对象操作更美观。例如字符串string用加号(+)拼接、cout用两个左尖括号(<<)输出。运算符重载函数的语法:返回值operator运算符(参数列表);运算符重载函数的返回值类型要与运算符本身的含义一致。非成员函数版本的重载运算符函数:形......