《Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用》
高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用。
第一种用法经常用到,第二种用法我们很少使用。我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好。因为这种方法表达比较复杂,条理难以理清。
变量的替换引用:
我们使用变量的时候,经常对它的值(字符串)进行操作。
操作字符串,通常使用字符串操作函数,比如 patsubst 函数(模式字符串替换函数),但是使用变量同样可以实现类似 patsubst 函数的功能。
我们通过下面的例子来具体分析。
写法一:
foo:=a.c b.c d.c
obj:=$(foo:.c=.o)
All:
@echo $(obj)
这段代码实现的功能是字符串的后缀名的替换,把变量 foo 中所有的以 .c 结尾的字符串全部替换成 .o 结尾的字符串。在 shell 命令行执行 make 命令,打印出来的是 "a.o b.o d.o" ,实现了文件名后缀的替换。
注意,括号中的变量,使用的是变量名而不是变量名的引用,变量名与参数选项之间用冒号隔开,表达式中间不能使用空格。
写法二:
foo:=a.c b.c d.c
obj:=$(foo:%.c=%.o)
All:
@echo $(obj)
在 shell 中执行 make 命令,发现结果和写法一是相同的。这里的表达式中使用了通配符 "%",表示自动匹配一个或多个字符。在开发的过程中,我们通常会使用这种方式来进行变量替换引用的操作。
写法二比写法一更加实用。因为在实际使用的过程中,我们对某个变量值的修改,可能不只是它的一部分,也可能是它的多个部分,那么第一种方式就不能实现了。比如:
foo:=a123c a1234c a12345c
obj:=$(foo:a%c=x%y)
All:
@echo $(obj)
这个例子中我们操作的是两个不连续的部分,执行 make 后打印的值是 "x123y x1234y x12345y",这种情况下我们使用第一种情况就不能实现,所以第二种的使用更全面。
变量的嵌套使用:
我们对一个变量进行赋值时可以引用其他的变量,并且引用变量的数量和和次数是不限制的。
下面我们通过几个实例来说明一下。
实例 1:
foo:=test
var:=$(foo)
All:
@echo $(var)
这种用法是最常见的使用方法,打印出 var 的值就是 test。我们可以认为是一层的嵌套引用。
实例 2:
foo=bar
bar=test
var:=$($(foo))
All:
@echo $(var)
执行 make 命令的时候得到的结果也是 test。$(foo) 代表的字符串是 bar,变量 bar 表示的值是 test,所以对 bar 的引用就是 test,所以最终 var 的值就是 test。这是变量的二层嵌套执行。当然我们还可以使用三层的嵌套执行,写法跟上面的方式是一样的。嵌套的层数也可以更多,但是不提倡使用。
我们在给一个变量进行赋值时,可以同时引用多个变量,还可以包含一些文本字符。比如:
first_pass=hello
bar=first
var:=$(bar)_pass
all:
@echo $(var)
或者
first_pass=hello
bar=first
foo=pass
var:=$(bar)_$(foo)
all:
@echo $(var)
执行 make 时, var 的值是 hello。
《Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- 工控领域上云实践-Zstack和软赢
工业以太网常见五大协议对比 大规模电机控制的方案选择-电机和驱动器篇 大规模电机控制的方案选择-控制器篇 工控领域有各种各样的总线来通讯以控制设备,很小众的接口规范慢慢的更小众了,最常见的接口规范就是 ...
- 安卓逆向 IDA 动态调试 案例1
adb forward tcp:23946 tcp:23946 adb devices adb shell su cd /data/local/tmp ./android_server adb she ...
- KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想
KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想 阅读本文之前,您最好能够了解 KMP 算法解决的是什么问题,最好能用暴力方式(Brute Force)解决一下该问题 ...
- 图文指南 篇二:虚拟机ESXi6.7安装黑群晖教程
转载:什么值得买 (ESXI虚拟机是非常好用的多开虚拟机是VM系列非常强的) https://post.smzdm.com/p/agd8l34w/#:~:text=7%E5%AE%89%E8%A3%8 ...
- 看完这一篇,ShardingSphere-jdbc 实战再也不怕了
谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...
- wps二次开发
JSAPI概述及原理 : [金山文档]JSAPI概述及原理 https://kdocs.cn/l/skWT29577eEE JSAPI集成开发文档 [金山文档]JSAPI集成开发文档 https:// ...
- 暴风影音16 v9.05.1202.1111 绿色版
修改历史:2022.12.14:自改官方 9.05.1202.1111 最新正式版本2022.06.27:自改官方 9.04.1029.1111 最新正式版本...... 修改内容:by.呆彤儿 / ...
- 【随手记】Burp Suite 设置HTTP2
Burp Suite 设置HTTP2
- unity 实现Game窗口的Stats 【转自蛮牛】
using UnityEngine;using System.Text;using UnityEditor; public class ShowFps : MonoBehaviour{ public ...
- 067_VFPage中Js与controller交互方式(二) RemoteAction
上篇文章介绍了Toolkit API,是一种js的前台写法 同步调用格式:sforce.connection.method("argument1","argument2& ...