makefile 变量赋值方式

news2024/12/28 4:26:39

文章目录

  • 前言
  • 一、变量的定义和使用
  • 二、变量的赋值方式
      • 1,简单赋值 ( := )
      • 2,递归赋值 ( = )
      • 3,条件赋值 ( ?= )
      • 4,追加赋值 ( += )
  • 三、预定义变量
      • 1. 自动变量
      • 2. 自动变量示例
      • 3. 特殊变量
      • 4. 特殊变量示例
  • 总结

前言


一、变量的定义和使用

  1. makefile 中支持程序设计语言中的变量的概念。
    makefile 中的变量 只代表文本数据 (字符串)

makefile 中的变量规则:

  • 变量名可以包含 字符,数字,下划线。
  • 不能包含 " : ", " # ", " = ", 或 " "。
  • 变量名大小写敏感。
  1. 定义使用变量:
    Makefile 中的变量是用于存储 特定值或字符串 的对象。
    在这里插入图片描述
    CC := gcc 表明 定义一个变量 CC, 将它赋值为 gcc ,定义了编译器的类型。
    这里的 := 就是简单的变量赋值方式,相当于 c 语言中的=

在这里插入图片描述
$( ) 的作用是引用变量.

二、变量的赋值方式

不同的赋值方式意义不同。
makefile 支持 4 中变量的赋值方式。

1,简单赋值 ( := )

  • 程序设计语言的通用的赋值方式。
  • 只针对当前语句的变量有效。

例如:定义 变量 x, y ,并对其进行简单赋值。

x := foo
y := $(x)
x := new

test :
	@echo "x => $(x)"
	@echo "y => $(y)"

在这里插入图片描述

2,递归赋值 ( = )

  • 赋值操作可能 影响多个其他的变量
  • 所有与目标变量相关的其他变量都将收到影响。

使用递归对 x 赋值,则可能会影响其他值的变化。

x = foo
y = $(x)b
x = new

test :
	@echo "x => $(x)"
	@echo "y => $(y)"

在这里插入图片描述

3,条件赋值 ( ?= )

  • 如果变量未定义,使用赋值符号中的值定义变量。
  • 如果变量已经定义,则复制无效。(适用于第一次赋值

使用 条件复制 二次对 x 进行赋值,就不会改变 x 。

x := foo
y := $(x)b
x ?= new

test :
	@echo "x => $(x)"
	@echo "y => $(y)"

在这里插入图片描述

4,追加赋值 ( += )

  • 原变量值之后加上一个新值。(类似于字符串的添加)
  • 原变量值与新值之间由空格给隔开。
x := foo
y := $(x)b
x += new

test :
	@echo "x => $(x)"
	@echo "y => $(y)"

在这里插入图片描述

三、预定义变量

在 makefile 中存在一些预定义变量。

Makefile 中预定义变量是指由 Make 工具提前定义好的、可以直接在 Makefile 中使用的变量,这些变量包括了常见的编译和链接选项,以及 Make 工具本身的一些参数和配置信息。

1. 自动变量

Makefile 中的自动变量是指在 Make 命令执行过程中,自动生成并可供使用的特殊变量。这些变量在用于保存临时信息或函数返回值,帮助我们更好地完成规则定义和执行。

常用的自动变量:

  • $@:当前规则中触发命令被执行的 目标

  • $> : 当前规则中的所有依赖

  • $< : 当前规则中的第一个依赖

  • $*:匹配通配符(%)的部分,例如规则中的 %.c匹配了foo.c,则$* 的值为foo。

  • $?:比目标文件更新的所有依赖文件名称列表,以空格分隔。

2. 自动变量示例

示例 一:

.PHONY : all first second third  		// 伪目标的声明

all : first second third
	@echo "\$$@ => $@"			// @ 可消除回显
	@echo "$$^ => $^"
	@echo "$$< => $<"
	
firtst:					// 没有依赖,命令,永远是最新的
second:
third:

对于 @echo " $$^ => $^ " 的命令, => 左边和右边的不同;右边即是 变量本身,左边是文本。

注意:

  • " $ " 对于makefile 有特殊的含义。输出时需要加一个 " $ " 进行转义
  • " $@ " 对于Bash Shell 有特殊的含义。输出时需要加一个 " \ " 进行转义
    在这里插入图片描述

示例 二:

CC := g++				// 定义一个变量CC 并赋值为 g++.
TARGET := hello-world.out		// 目标

$(TARGET) : func.o main.o		// 使用定义的变量直接使用 $ 即可,TARGET 依赖于 func.o, main.o
	$(CC) -o $@ $^

func.o : func.c
	$(CC) -o $@ -c $^

main.o : main.c
	$(CC) -o $@ -c $^

.PHONY : rebuild clean all			// 伪目标的声明

rebuild : clean all				// rebuild 伪目标依赖于clean ,all

all : $(TARGET)	

clean :
	$(RM) *.o $(TARGET)			// 删除所有的 .o 和 hello-world.out文件

在这里插入图片描述

3. 特殊变量

一些特殊变量的含义:

  • $(MAKE):当前的 make 解释器的文件名

  • $(MAKECMDGOALS):命令行中的目标名(make 的命令行参数)

  • $(MAKEFILE_LIST):make 需要处理的文件列表。当前makefile 的文件名总是位于列表的最后。文件名之间以空格分割。

  • $(MAKE_VERSION ):当前的 make 解释器的版本。

  • $(CURDIR):当前工作目录的完整路径。这个变量通常用于构建绝对路径的文件名或目录名。

  • $(.VARIABLES):所有已经定义的变量列表。(预定义变量 和 自定义变量)

  • $(RM):用于删除文件的命令,默认是 rm -f。你可以显式设置 RM 变量来指定其他的删除命令。

  • $(AR):用于创建静态库的命令,默认是 ar。你可以显式设置 AR 变量来指定其他的命令。

  • $(ARFLAGS):传递给 $(AR) 命令的选项,默认为空。你可以显式设置 ARFLAGS 变量来指定其他的选项。

4. 特殊变量示例

.PHONY : all out first second third test

all out : 
	@echo "$(MAKE)"
	@echo "$(MAKECMDGOALS)"
	@echo "$(MAKEFILE_LIST)"
	
	
first :
	@echo "first"
	
second :
	@echo "second"
	
third :
	@echo "third"
	
test :
	@$(MAKE) first
	@$(MAKE) second
	@$(MAKE) third

在这里插入图片描述


总结

下一节介绍 变量的进阶。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django框架003:orm与MySQL数据库的连接及踩坑记录

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

FFCNet:基于傅立叶变换的频率学习和复杂卷积网络用于结肠疾病分类

文章目录 FFCNet: Fourier Transform-Based Frequency Learning and Complex Convolutional Network for Colon Disease Classification摘要方法Patch Shuffling Module (PSM)Frequency-Domain Complex NetworkComplex ConvolutionComplex ReLUComplex BN 实验结果 FFCNet: Fou…

1— .Net MVC之控制器

在上下文中使用的控制器 问题 答案 什么是控制器&#xff1f; 控制器包含用于接收请求、更新应用程序状态或模型以及选择将发送给客户端的响应的逻辑 控制器有什么用&#xff1f; 控制器是MVC项目的核心&#xff0c;并包含Web应用程序的逻辑 如何使用控制器&#xff1f; …

第五讲:设计库的管理和使用

第五讲&#xff1a;设计库的管理和使用 概述&#xff1a; 课程内容简介&#xff1a; 1、 下载Design kit 2、 安装 Design kit 3、 Design kit的使用 4、 如何进行优化设计 Design Kit – 由元件厂商所提供设计元件库&#xff0c; PDK – Process Design Kit &#xff08;IC的…

智能改写工具免费-智能改写工具

中文改写软件 您好&#xff0c;中文改写软件是使用人工智能技术改写中文文本的工具。它可以自动识别并改写文本中的某些词语、短语或句子&#xff0c;以使它们在语意上更为准确、清晰或通顺。 中文改写软件的工作原理基于自然语言处理技术。它使用预先训练好的模型&#xff0…

Windows Server 2016安装Mysql 5.6

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

软考——软件工程,面向对象,数据流图,数据库设计,UML建模,数据结构及算法应用,面向对象程序设计

软件工程 开发模型 瀑布模型 其他模型 增量模型和螺旋模型 V模型 瀑布模型是结构化模型&#xff0c;喷泉模型是面向对象模型 构件组装模型&#xff08;CBSD&#xff09; 统一过程 敏捷开发方法 信息系统开发方法 需求 结构化设计 基本原则 内聚与耦合 软件测试 测试原则与类…

Nmap服务版本探测研究

文件nmap-services 作用&#xff1a;预定义服务和端口映射表&#xff0c;该文件原则上不允许修改 nmap-services未定义33890端口映射&#xff0c;扫描结果&#xff1a; PORT STATE SERVICE REASON 33890/tcp open unknown syn-ack nmap-services定义33890端口映射&#x…

从环形图出发,打造高效数据分析流程

什么是环形图&#xff1f; 环形图是一种数据可视化的图表类型&#xff0c;它通常用于显示数据的比例关系和占比情况。环形图与饼图类似&#xff0c;都是由一个圆形或圆环和若干个扇形组成&#xff0c;每个扇形的面积大小表示该数据所占比例的大小。与饼图不同的是&#xff0c;…

强化学习p4-Actor-Critic

策略网络和价值网络的架构 我们知道状态价值函数 V π ( s ) ∑ a π ( a ∣ s ) ⋅ Q π ( s , a ) V_\pi(s)\sum_a\pi(a|s)\cdot Q_\pi(s,a) Vπ​(s)∑a​π(a∣s)⋅Qπ​(s,a)&#xff0c;在策略学习中&#xff0c;我们用神经网络去近似 π \pi π函数&#xff0c;得到策…

模糊PID(重心法解模糊梯形图FC)

模糊PID的模糊化请参看下面的博客文章: 博途PLC模糊PID三角隶属度函数指令(含Matlab仿真)_plc 模糊pid_RXXW_Dor的博客-CSDN博客三角隶属度函数FC,我们采用兼容C99标准的函数返回值写法,在FB里调用会更加直观,下面给大家具体讲解代码。常规写法的隶属度函数FC可以参看下…

分享一个提高运维效率的 Python 脚本

哈喽大家好我是咸鱼&#xff0c;今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景&#xff1a; 容灾切换的时候批量对机器上的配置文件内容进行修改替换对机器批量替换某个文件中的字段 对于 Linux 机器&#xff0c;咸鱼可以…

Fiddler 抓包工具使用 - 手摸手教你

Fiddler简介 Fiddler 是一款免费、灵活、操作简单、功能强大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、过滤会话、分析请求详细内容、伪造客户端请求、篡改服务器响应、重定向、网络限速、断点调试等功能。 Fiddler工作…

2023什么蓝牙耳机好?经销商盘点新手必入蓝牙耳机品牌

蓝牙耳机是除手机外我们使用频率最高的数码产品&#xff0c;我做蓝牙耳机经销商五年来&#xff0c;对各个品牌都有深入了解。近期看到很多新手们咨询什么蓝牙耳机好&#xff0c;我给大家盘点一下新手必看的五大蓝牙耳机品牌。 1.JEET Air 2蓝牙耳机 推荐理由&#xff1a;专为舒…

和AI聊天

AI产品工具目录&#xff1a;AI产品目录 Prompt 在和AI聊天时&#xff0c;你得表明你需要啥&#xff0c;并且描述的越精确&#xff0c;AI回答的就越贴近你的预期&#xff0c;简单的对话&#xff0c;可以自己尝试&#xff0c;但是如果想做应用级别的就得学习这种聊天技术&#…

Guitar Pro8.1最新中文版自动扒谱编写吉他谱 新功能讲解

Guitar Pro8是一款非常受欢迎的音乐制作软件&#xff0c;它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款软件可能已经成为全球最受欢迎的吉他打谱软件&#xff0c;在编写吉他六线谱和乐队总谱中始终处于行业领先地位&…

测试人的内卷,性能测试入门到实践该如何做?突破内卷...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试如何入门…

什么是边缘计算盒子?要看哪些参数

一、什么是边缘计算盒子 边缘计算盒子&#xff08;Edge Computing Box&#xff09;是一种用于边缘计算的设备&#xff0c;通常包括计算、存储、网络和安全等功能。它通常是一台小型的计算机&#xff0c;可以放置在物联网设备、传感器或其他边缘设备附近&#xff0c;用于处理和…

北峰通信,用专业打造“全方位、立体化”应急通信保障体系

最近热映的电影《惊天救援》里&#xff0c;杜江饰演的消防员韩凯&#xff0c;在一次化工园区发生爆炸后&#xff0c;他作为消防救援站里的通信员&#xff0c;第一时间奔赴重灾区&#xff0c;及时将第一现场的情况传到了后方指挥部。 众所周知&#xff0c;通讯系统是生命线系统的…

linux 定时器

Linux 系统实现底半部的机制主要有tasklet&#xff0c;工作队列和软中断。 tasklet 和工作队列都是调度中断底半部的良好机制&#xff0c;tasklet 基于软中断实现。 内核定时器也依靠软中断实现;内核中的延时是忙等待或者睡眠等待&#xff0c;为了充分利用CPU资源&#xff0c…