Makefile基础教学(预定义变量)

news2024/12/29 10:01:26

文章目录

  • 前言
  • 一、自动变量的概念
  • 二、自动变量在工程中的应用
  • 三、特殊变量的使用
  • 四、特殊变量在工程中的应用
  • 总结


前言

上篇文章讲解到了变量的使用,这篇文章继续讲解预定义变量。

一、自动变量的概念

在Makefile中,自动变量指的是可以在编写规则或命令中使用的特殊变量,这些变量的值会根据上下文不同而自动地发生变化,从而可以方便地编写通用的规则或命令。

以下是一些常用的自动变量:

$@:目标文件的名称,即规则中的目标(target)。

$<:规则中第一个依赖文件的名称。

$^:规则中所有依赖文件的名称(去重之后)。

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

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

下面编写一个makefile测试一下这些变量到底指代的是什么:

all : first second third
	@echo "\$$@ => $@"
	@echo "$$^ => $^"
	@echo "$$< => $<"
	@echo "$$*< => $$*"
	@echo "$$?< => $$?"

first : 

second :

third :

运行结果:
在这里插入图片描述

二、自动变量在工程中的应用

使用自动变量可以直接简化我们的Makefile程序当我们再次进行修改的时候会显得非常方便。

CC := gcc
TARGET := hello

TARGET : hello.o func.o
	$(CC) -o $@ $^

hello.o : hello.c
	$(CC) -c -o $@ $<

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

.PHONY: clean rebuild all

rebuild : clean all

all : TARGET

clean :
	rm *.o TARGET

三、特殊变量的使用

$(MAKE):用来递归调用 Makefile 的命令。这个变量可以让你在一个 Makefile 中调用另一个 Makefile。通常情况下,它被设置为 make,也就是递归调用 make 命令。这个变量通常不需要显式设置,它的默认值就是 make。

$(MAKECMDGOALS):被执行的 Makefile 的目标列表,以空格分隔。例如,如果你运行 make foo bar,那么 $(MAKECMDGOALS) 的值就是 foo bar。你可以通过这个变量来判断当前执行的目标是哪个,以便根据需要执行不同的操作。

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

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

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

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

像这种特殊变量还有很多我们主要就挑其中几个重要的来进行讲解。

我们先来打印一下这些变量具体指代的是什么吧:

all : 
	@echo "$(MAKE)"
	@echo "$(MAKECMDGOALS)"
	@echo "$(MAKEFILE_LIST)"
	@echo "$(MAKE_VERSION)"
	@echo "$(CURDIR)"
	@echo "$(.VARIABLES)"

运行结果:
在这里插入图片描述
通过这个运行结果很清楚的可以看出这些特殊变量都具体指代的是什么意思。

四、特殊变量在工程中的应用

这里我只做了一个简单的修改使用RM预定义变量代替了rm,其他的功能作用大家可以自己去尝试。

CC := gcc
TARGET := hello

TARGET : hello.o func.o
	$(CC) -o $@ $^

hello.o : hello.c
	$(CC) -c -o $@ $<

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

.PHONY: clean rebuild all

rebuild : clean all

all : TARGET

clean :
	$(RM) *.o TARGET

总结

除了上述这些变量之外,还有许多其他的变量可以在 Makefile 中使用,具体可以参考 GNU Make 的官方文档。通过引用这些变量,在 Makefile 中可以更加灵活地处理命令和操作。

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

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

相关文章

Webpack5 应用

文章目录 Webpack5 应用处理CSS文件使用css-loader和style-loader内联CSS安装配置webpack.config.js编写源代码编译打包 使用css-loader和mini-css-extract-plugin外部链接CSS安装配置webpack.config.js编译打包 处理图片资源自动清空上次打包内容 Webpack5 应用 处理CSS文件 …

(9)Qt---网络编程

目录 1. 复习 1.1 UDP 与TCP 1.2 IP地址与端口号 2. 前期准备 3. 编程内容 1. 复习 1.1 UDP 与TCP UDP TCP 协议相同点&#xff1a;都存在于传输层 TCP&#xff08;即传输控制协议&#xff09;&#xff1a; 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即…

[WiFi] WiFi 5G DFS机制及认证

DFS机制及认证 DFS是Dynamic Frequency Selection (DFS)&#xff0c;动态频率选择&#xff08;DFS&#xff09;是指允许未经许可的设备&#xff08;尤其是在室外操作的设备&#xff09;共享已分配给雷达系统的5GHz频段而不会对这些雷达造成干扰的机制。启用DFS功能后&#xff0…

PostGIS的安装与建库(Windows)

PostGIS的安装与建库(Windows) 文档目录 PostGIS的安装与建库(Windows)安装PostgreSQL安装PostGIS构建空间数据库 安装PostgreSQL 首先&#xff0c;以管理员身份运行 postgresql-13.5-1-windows-x64。(下面是安装包下载链接) 链接:https://pan.baidu.com/s/1vr6_zwOzW4UW6zwf6…

Backpropagation(反向传播)

是一种高效计算梯度下降的方法。 Chain Rule&#xff08;链式法则&#xff09; 定义了一个loss function是所有training data的loss之和。 考虑某一个neuron的情况 Forward Pass z对w的偏微分就是输入x。 Backward Pass Case1- Output Layer 假设两个红色的neuron已经是outpu…

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——课程学习(5)

文章目录 概述一、Approaches And Challenges生成的声音是什么类型训练模型使用的是什么特征原始音频Raw Audio频谱图Spectrograms 声音生成模型常用的结构生成模型的输入 二、Autoencoders Explained Easily自动编码器的通俗解释PCA和编码器的区别如何训练一个编码器Deep Auto…

深眸科技|机器视觉加速渗透各行各业,推进制造业智能制造进程

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;机器视觉技术作为其重要分支&#xff0c;加速渗透进我国制造业生产环节&#xff0c;覆盖从装配到检测等高端复杂领域&#xff0c;推进我国从制造大国迈向制造强国的进程。 机器视觉技术在工业生产过程中具有多种应用&…

域名历史查询工具-批量域名历史注册记录查询

批量备案域查询 在互联网时代&#xff0c;域名备案已经成为一项必要工作&#xff0c;但是批量备案域名是一项繁琐和费力的工作。为了帮助企业和个人轻松应对域名备案&#xff0c;出现了一种新型的解决方案——批量备案域名查询监控软件。 这种软件的最大优势是自动化&#xf…

域名备案批量查询工具-域名备案查询

为什么域名要备案 域名备案是一种互联网服务管理制度。其主要目的是加强互联网信息管理&#xff0c;维护网络安全和公共利益&#xff0c;规范网站的使用和运营行为。备案对于网站和域名的合法性和正常运营都具有重要的意义。没有备案的域名无法在大陆境内访问&#xff0c;并可…

linux发行家族和发行版及安装软件方式

在Linux平台下&#xff0c;软件包的类型可以划分为两类&#xff1a;源码包、二进制包&#xff1b; 一个软件要在Linux上执行&#xff0c;必须是二进制文件&#xff1b; 源码包&#xff1a;即程序软件的源代码&#xff08;一般也叫Tarball&#xff0c;即将软件的源码以tar打包后…

功能测试包含哪些测试?分别有什么作用?

功能测试包含哪些测试&#xff1f;功能测试主要包括链接测试、表单测试、搜索测试、删除测试、cookies、session测试、数据库测试等部分。功能测试对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。 功能…

WPS表格的IF与AND函数典型应用实例

HR人士在招聘时经常需要对面试人员进行三次面试都合格才给录取&#xff0c;如果单独使用一个IF函数没有办法进行三个成绩判断&#xff0c;这就需要使用IF函数结合AND函数配合起来使用。先看一下示例数据表&#xff0c;当初试、复试、终试三个成绩都大于80才返回录取。 先看一下…

第1章:项目管理概论

1、《项目管理知识体系指南》&#xff08;《指南》&#xff09;作为一部公认的项目管理标准&#xff0c;规定了在大多数时间适用于大多数项目的知识和做法。这些知识和做法&#xff1a; 答案&#xff1a;可供各种项目裁剪使用 2、《指南》是关于以下哪个的标准&#xff1f; …

ADS1299IPAGR 8通道、低噪声模拟前端,TPS7B7701QPWPRQ1单通道低压降稳压器(LDO)

ADS1299IPAGR 模拟前端&#xff08;AFE&#xff09;是8通道、低噪声、24位、同步采样Δ∑模数转换器 (ADC)。这些ADC配有内置可编程增益放大器 (PGA)、内部基准和板载振荡器。ADS1299-x集成了颅外脑电图 (EEG) 和心电图 (ECG) 应用所需的全部常用功能。凭借高集成度和卓越性能&…

TDengine 部署与使用----时序数据库

官网 通过 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 docker安装 拉取最新docker镜像 docker pull tdengine/tdengine:latest 然后执行 docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine 查看容器…

VMware Aria Automation Config 8.12 - Aria Automation 的软件配置管理与安全性

VMware Aria Automation Config 8.12 - Aria Automation 的软件配置管理与安全性 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-automation-config/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Aria Aut…

Shell——正则表达式

正则表达式的作用 通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 正则表达式的构成 正则表达式是由普通字符与元字符组成 普通字符包括大小写字母、数字、标点符号及一些其他符号 元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c;可以用…

零基础入门测试该学什么?最全整理,照着学就对了

零基础入门测试该学什么&#xff1f;最全整理&#xff0c;照着学就对了 于很多小白而言&#xff0c;想要转行软件测试岗位&#xff0c;却又怕自己从来没有接触过计算机&#xff0c;底子很薄弱&#xff0c;从而还没开始就打起了退堂鼓。也有许多初学者&#xff0c;在入门的过程…

虚拟化技术介绍-VMware和Docker的区别

都说今天是一个云时代&#xff0c;其实云的本质就是由基础架构提供商提供基础架构&#xff0c;应用开发商不再关心基础架构。我们可以类比人类刚刚发明电的时候&#xff0c;工厂需要自己建电站&#xff0c;而现在只需要电线和插座就可以使用电。云时代让我们可以在分钟、甚至秒…

ASEMI代理ADI亚德诺ADUM3211TRZ-RL7原厂芯片

编辑-Z ADUM3211TRZ-RL7参数描述&#xff1a; 型号&#xff1a;ADUM3211TRZ-RL7 数据速率&#xff1a;10 Mbps 传播延迟&#xff1a;50 ns 脉冲宽度失真&#xff1a;3 ns 脉冲宽度&#xff1a;100 ns 输出上升/下降时间&#xff1a;2.5 ns 供电电流&#xff1a;2.6 mA …