06-07 - 变量的高级主题

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 变量值的替换
  • 2. 变量的模式替换
  • 3. 规则中的模式替换
  • 4. 变量值的嵌套使用
  • 5. 命令行变量
  • 6. 环境变量
  • 7. 目标变量(局部变量)
  • 8. 模式变量
  • 9. 工程

1. 变量值的替换

  • 使用指定字符(串)替换变量值中的后缀字符(串)
  • 语法格式:$(var:a=b)${var:a=b},即:使用 b 替换变量 var 的后缀 a
    • 替换表达式中不能有任何的空格
    • make 中支持使用 ${} 对变量进行取值
src := a.cc b.cc c.cc
obj := $(src:cc=o)test:@echo "obj => $(obj)"

在这里插入图片描述

2. 变量的模式替换

  • 使用 % 保留变量值中的指定字符串,替换其它字符。% 可以理解为 Makefile 中的通配符
  • 语法格式:$(var:a%b=x%y)${var:a%b=x%y}
    • 替换表达式中不能有任何空格
    • make 中支持使用 ${} 对变量进行取值
src := a1b.c a2b.c a3b.c
obj := $(src:a%b.c=x%y)test:@echo "obj => $(obj)"

在这里插入图片描述

3. 规则中的模式替换

在这里插入图片描述

  1. %.o 在 OBJS 中匹配子目标,首先找到 func.o
  2. 再根据 func.o 找个子目标生成依赖 func.c,构成整个规则 func.o: func.c
  3. 继续 1 和 2,匹配其它子目标
.PHONY : clean rebuild alltarget := hello.out
CC := gccobj : main.o func.o#使用模式规则替换,避免每一条.c都要写一个编译命令
$(obj) : %o : %c$(CC) -o $@ -c $^$(target) : main.o func.o$(CC) -o $@ $^all : $(target)rebuild : clean allclean : rm -f *.o $(target)

在这里插入图片描述

4. 变量值的嵌套使用

  • 一个变量名之中可以包含对其它变量的引用
  • 嵌套引用的本质是使用一个变量表示另外一个变量

在这里插入图片描述

x := y
y := z
val := $($(x))all:@echo "val => $(val)"

在这里插入图片描述

5. 命令行变量

  • 运行 make 时,在命令行定义变量
  • 命令行变量默认覆盖 makefile 中定义的变量
hm := hello makefiletest:@echo "hm => $(hm)"

在这里插入图片描述

  • override 关键字
    • 使用 override 关键字可以防止 makefile 中定义的变量被命令行变量覆盖
    • override 用于指示 makefile 中定义的变量不能被覆盖
    • 变量的定义和赋值都需要使用 override 关键字
      在这里插入图片描述
  • define 关键字
    • 用于在 makefile 中定义多行变量
    • 多行变量的定义从变量名开始到 endef 结束
    • 可使用 override 关键字防止变量被覆盖
    • define 定义的变量等价于使用 = 定义的变量
define fool
I'm fool!
endefoverride define cmd@echo "run cmd here"
endeftest:@echo "fool => $(fool)"$(cmd)

在这里插入图片描述

6. 环境变量

  • makefile 中能够直接使用环境变量的值
    • makefile 中定义与环境变量同名的变量,环境变量会被覆盖
    • 运行 make 时指定 -e 选项,优先使用环境变量
  • 变量在不同 makefile 之间的传递
    • 直接在外部定义环境变量进行传递(不推荐,因为依赖于系统,导致 makefile 的移植性问题)
    • 使用 export 定义变量进行传递(定义临时环境变量)
    • 定义 make 命令行变量进行传递(推荐做法)
HOME := new_hometest:@echo "$(HOME)"

由 make 结果可知,系统中的环境变量 HOME 的内容 /home/wx,在 makefile 中被改为了 new_home

在这里插入图片描述

# MakefileHOME := new_home
var := uuxiangtest:@echo "HOME => $(HOME)"@echo "var => $(var)"@echo "make Makefile.2"@$(MAKE) -f Makefile.2
# Makefile.2test:@echo "HOME => $(HOME)"@echo "var => $(var)"

make 时,HOME 被临时改写为了 new_home,因此,这个值被传递到 Makefile.2 中,而 var 的作用域只在 Makefile 中,取法传递到 Make file.2 中,因此,输出为空。
在这里插入图片描述

如果想要将 var 也传递到 Makefile.2 中,可以使用 export 关键字。

# MakefileHOME := new_home
export var := uuxiang
new := hellotest:@echo "HOME => $(HOME)"@echo "var => $(var)"@echo "make Makefile.2"@$(MAKE) -f Makefile.2@$(MAKE) -f Makefile.2 new:=$(new)
# Makefile.2test:@echo "HOME => $(HOME)"@echo "var => $(var)"@echo "new => $(new)"

export 关键字修饰 var 变量,使其成为临时环境变量,这样就可以传递到 Makefile.2 中了。

在这里插入图片描述

7. 目标变量(局部变量)

  • 作用域只在指定目标及连带规则中
var := hellotest: var := test-vartest: another@echo "test:"@echo "var => $(var)"another:@echo "another:"@echo "var => $(var)"

test: var := test-var,即定义了目标变量 var,此时这个变量的值 test-var 的作用域在 test 目标及其连带规则中,而在其它地方,var 变量的值仍然为 hello,这个变量值的作用域为整个文件。

在这里插入图片描述

var := hellotest: var := test-vartest:@echo "test:"@echo "var => $(var)"another:@echo "another:"@echo "var => $(var)"

在这里插入图片描述

8. 模式变量

  • 模式变量时目标变量的扩展
  • 作用域只在符合模式的目标及连带规则中
var := hellotest: var := test-varnew := uuxiang%e: override new := test-newtest:@echo "test:"@echo "var => $(var)"@echo "new => $(new)"rule:@echo "rule:"@echo "var => $(var)"@echo "new => $(new)"

rule 目标对应的规则符合 %e 模式,因此,rule 规则中的 new 输出为 test-new 为模式变量。

在这里插入图片描述

9. 工程

【06-07 变量的高级主题】

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

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

相关文章

vue-img-cutter 图片裁剪详解

前言&#xff1a;vue-img-cutter 文档&#xff0c;本文档主要讲解插件在 vue3 中使用。 一&#xff1a;安装依赖 npm install vue-img-cutter # or yarn add vue-img-cutter # or pnpm add vue-img-cutter 二&#xff1a;构建 components/ImgCutter.vue 组件 <script se…

激光雕刻优化:利用RLE压缩技术提高雕刻效率与节省能源成本

什么是 RLE &#xff1f;RLE 在激光雕刻应用实现代码&#xff1a;总结 什么是 RLE &#xff1f; RLE 是 Run-Length Encoding&#xff08;游程长度编码&#xff09;的缩写。这是一种数据压缩技术&#xff0c;它通过减少连续重复的数据来减小文件的大小。RLE 在图像处理、无损…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

小程序预览或上传代码时,遇到app.json未找到某个wxml文件的解决方法

uniapp小程序&#xff0c;点击预览或者是上传代码&#xff0c;遇到app.json无法找到某个wxml文件的解决方法&#xff1a;清缓存 问题&#xff1a; message&#xff1a;Error: app.json: 未找到 ["subPackages"][3]["pages"][3] 对应的 subPackages4/pages/…

PXE 批量安装部署

目录 一、PEX批量部署优点 二、PXE&#xff1a;预启动执行环境 三、搭建PXE远程服务器 要想全自动安装 接下来请看步骤&#xff1a; 一、PEX批量部署优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统 配置各种服务远程实现&#xff1a;不需要光盘&…

语音识别--光谱门控降噪

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计7267字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

FSC森林认证是什么?

FSC森林认证&#xff0c;又称木材认证&#xff0c;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。FSC森林认证包括森林经营认证&#xff08;Forest Management, FM&#xff09;和产销监管链认证&#xff08;Chain of Custody, COC&#…

使用IIS部署Vue项目

前提 使用IIS部署Vue项目&#xff0c;后端必须跨域&#xff0c;不要在Vue中用proxy跨域&#xff0c;那个只在dev环境中有用&#xff01; IIS安装&#xff0c;不用全部打勾&#xff0c;有些他默认就是方块 ■ 选择性安装的&#xff0c;就维持原样就可以。 添加网站配置 右键…

Ecovadis认证是什么?

Ecovadis认证是一种企业社会责任&#xff08;CSR&#xff09;评估和评级的认证&#xff0c;旨在衡量企业在环境、劳工和人权、道德以及可持续采购四个方面的可持续发展表现。该认证已成为全球范围内许多公司和组织的评估标准之一&#xff0c;有助于提高企业的会声誉和可持续发展…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

Pycharm无法链接服务器环境(host is unresponsived)

困扰了很久的一个问题&#xff0c;一开始是在服务器ubuntu20.04上安装pycharm community&#xff0c;直接运行服务器上的pycharm community就识别不了anaconda中的环境 后来改用pycharm professional也无法远程连接上服务器的环境&#xff0c;识别不了服务器上的环境&#xff…

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…

2024DCIC海上风电出力预测Top方案 + 光伏发电出力高分方案学习记录

海上风电出力预测 赛题数据 海上风电出力预测的用电数据分为训练组和测试组两大类&#xff0c;主要包括风电场基本信息、气象变量数据和实际功率数据三个部分。风电场基本信息主要是各风电场的装机容量等信息&#xff1b;气象变量数据是从2022年1月到2024年1月份&#xff0c;…

翻译《The Old New Thing》- Rendering menu glyphs is slightly trickier

Rendering menu glyphs is slightly trickier - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050802-13/?p34743 Raymond Chen 2005年08月02日 上次&#xff0c;我们看到了如何绘制有主题和无主题的单选按钮&#xff0c;我提到菜单位图更…

cmake进阶:目录属性说明一

一. 简介 接下来简单学习一下 cmake 中的属性相关的概念。 属性大概可以分为多种&#xff1a;全局属性、目录属性&#xff08;源码属性&#xff09;、目标属性以及其它一些分类。 二. cmake进阶&#xff1a;目录属性 cmake中的属性可以 在如下网址查询到&#xff1a; http…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train()&#xff0c;model.eval()作用&#xff1f; model.train() 和 model.eval() 是 PyTorch 中的两个方法&#xff0c;用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下&#xff0c;模型会启用 dropout 和 batch norm…

python爬虫学习------scrapy第三部分(第三十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…