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://www.hqwc.cn/news/675702.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DMAR: [INTR-REMAP] Present field in the IRTE entry is clear 的解决办法

问题描述 在使用FPGA开发PCIe的MSI-X中断相关功能时,一次测试过程中dmesg打印出如下错误,使用cat /proc/interrupts查看FPGA的PCIe驱动程序未收到MSIX中断。使用的系统为基于Intel x86_64的linux(RHEL8.9),基于Xilinx …

SQL注入实例(sqli-labs/less-1)

初始网页 从网页可知传递的参数名为 id,并且为数字类型 1、得知数据表有多少列 1.1 使用联合查询查找列数(效率低) http://localhost/sqli-labs-master/Less-1/?id1 union select 1,2 -- 1.2 使用order by查找列数(效率高&…

贪心问题 难度[普及-]一赏

目录 #小A的糖果 删数问题 陶陶摘苹果(升级版) P5019 NOIP2018 提高组 铺设道路 小A的糖果 原文链接: P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 小 A 有 n 个糖果盒,第 i 个盒中有 a_i 颗糖果。 小 A 每…

V23 中的新功能:LEADTOOLS 展示了它的 EXCEL-lence

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年,其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中,LEAD以其在全世界主要国家中占有的市场领导地位…

为什么你的企业需要微信小程序?制作微信小程序有什么好处?

什么是小程序? WeChat小程序作为更大的WeChat生态系统中的子应用程序。它们就像更小、更基本的应用程序,在更大的应用程序(WeChat)中运行。这些程序为用户提供了额外的高级功能,以便在使用WeChat服务时加以利用。根据…

汽车 - 什么是车轮抱死

车轮抱死分为两种情况,一种是车辆故障层面,另一种是驾驶过程中的物理现象。我们先来说最通俗的刹车车轮抱死吧。 刹车制动车轮抱死 车轮停止轴向转动就是抱死,有速度的情况下抱死车轮,如果车辆的惯性动能大于轮胎抓地力&#xff0…

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

【CTF Web】XCTF GFSJ0477 backup Writeup(备份文件+源码泄漏+目录扫描)

backup X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧! 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载: http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…

YOLOv8的训练、验证、预测及导出[目标检测实践篇]

这一部分内容主要介绍如何使用YOLOv8训练自己的数据集,并进行验证、预测及导出,采用代码和指令的两种方式,参考自官方文档:Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理,只需要把流程跑通就行,…

鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位

时间概念太重要了,在鸿蒙内核又是如何管理和使用时间的呢? 时间管理以系统时钟 g_sysClock 为基础,给应用程序提供所有和时间有关的服务。 用户以秒、毫秒为单位计时.操作系统以Tick为单位计时,这个认识很重要. 每秒的tick大小很大程度上决…

TalkingGaussian:基于高斯溅射的结构保持3D说话人头合成

TalkingGaussian: Structure-Persistent 3D Talking Head Synthesis via Gaussian Splatting TalkingGaussian:基于高斯溅射的结构保持3D说话人头合成 Jiahe Abstract 摘要 TalkingGaussian: Structure-Persistent 3D Talking Head Synthes…

五分钟解决Springboot整合Mybaties

SpringBoot整合Mybaties 创建maven工程整合mybaties逆向代码生成 创建maven工程 1.通过idea创建maven工程如下图 2.生成的工程如下 以上我们就完成了一个maven工程,接下来我们改造成springboot项目。 这里主要分为三步:添加依赖,增加配置&…