Makefile的简单语法学习

通配符

假如一个目标文件所依赖的依赖文件很多,那样岂不是我们要写很多规则,这显然是不合乎常理的,我们可以使用通配符,来解决这些问题。
我们对上节程序进行修改,代码如下:

test : a.o b.ogcc -o test $^%.o : %.cgcc -c -o $@ $<
  • %.o表示所有的.o文件
  • %.c表示所有的.c文件
  • $@:表示目标文件
  • $<:表示第一个依赖文件
  • $^:表示所有依赖文件

假想目标:.PHONY

我们想清除文件,在Makefile的结尾处添加如下代码就可以了:

clean:rm *.o test
  1. 执行make,生成第一个目标文件
  2. 执行make clean:清除所有文件

make后面可以带上目标名,也可以不带,如果不带目标名的话就会生成第一个规则里面的第一个目标。

make [目标]也可以不跟目标名,若无目标默认第一个目标。我们直接执行make的时候,会在makefile里面找到第一个目标然后执行下面的指令生成第一个目标。

当我们执行make clean的时候,就会在Makefile里面找到clean这个目标,然后执行下面的命令。

这个写法有些问题,原因是我们的目录里面没有clean这个文件
如果该目录下面有名为clean文件怎么办?

我们在该目录下创建一个名为clean的文件,然后重新执行make clean,结果显示

make: \`clean' is up to date.

一个规则能够执行的条件:

  1. 目标文件不存在
  2. 依赖比目标新

现在目标文件有,但是没有依赖文件,就无法判断文件的时间。
有同名的“clean”文件时,就没有办法执行make clean操作。解决办法:我们需要把目标定义为假象目标,用关键字PHONY

.PHONY:clean

重定向输出

在Linux命令行中,>符号通常用于重定向输出。
当输入> newfile时,它的作用是将命令的输出重定向到一个名为newfile的文件。
如果newfile文件不存在,则它会被创建;如果已经存在,则文件的内容会被覆盖。

如果希望输出追加到文件而不是覆盖文件内容,则可以使用>>符号。

command >> newfile

这样command的输出追加到newfile文件的末尾。

变量

在makefile中有两种变量:

  1. 简单变量(即时变量)
A := xxx #A的值在定义时就确定了
  1. 延时变量
B = xxx #B的值在使用时才确定

想使用变量的时候使用$来引用,如果不想看到命令输出时,在前面加上@符号。

:= # 即时变量
= # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
+= # 附加, 它是即时变量还是延时变量取决于前面的定义
?=: 如果这个变量在前面已经被定义了,这句话就会不会起效果

A := $(C)
B = $(C)
C = abc#D = 100ask
D ?= weidongshanall:@echo A = $(A)@echo B = $(B)@echo D = $(D)C += 123

输出
A =
B = abc 123
D = weidongshan

  1. A:=$©
    A为即时变量,在定义时就确定,由于刚开始时C值为空,所以A的值也为空。
  2. B=$©
    B为延时变量,只有使用到它的时候值才确定,当执行make时,会解析里面所有的变量,所以先解析C= abc,然后解析C += 123,此时,C = abc 123,当执行:@echo B = $(B) B的值为 abc 123。
  3. D?=weidongshan
    D变量在前面没有定义,所以D的值为weidongshan,如果在前面添加D = 100ask,最后D的值为100ask。

我们还可以通过命令行存入变量的值 例如:

执行:make D=123456 里面的 D ?= weidongshan 这句话就不起作用了。

函数foreach

$(foreach var,list,text)
A = a b c
B = (foreach f, $(A), $(f).o)all:@echo B = $(B)

在这里插入图片描述

函数filter/filter-out

C = a b c d/D = $(filter %/, $(C))
E = $(filter-out %/, $(C))all:@echo D = $(D)@echo E = $(E)

在这里插入图片描述

wildcard

$(wildcard pattern)

这个函数会以pattern这个格式,去寻找存在的文件,返回存在文件的名字

files = $(wildcard *.c)all:@echo files = $(files)

在这里插入图片描述
我们也可以用wildcard函数来判断,真实存在的文件

files2 = a.c b.c c.c d.c e.c abc
files3 = $(wildcard $(files2))all:@echo files3 = $(files3)

在这里插入图片描述

patsubst函数

files2 = a.c b.c c.c d.c e.c abcdep_files = $(patsubst %.c, %.d, $(files2))all:@echo dep_files = $(dep_files)

在这里插入图片描述

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

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

相关文章

【原创】java+swing+mysql办公用品管理系统设计与实现

摘要&#xff1a; 办公用品管理系统是一个设计和实现办公用品库存和使用管理的信息系统。此系统可以提高办公用品的利用率&#xff0c;减少浪费&#xff0c;使办公用品管理更加高效、规范、便捷。本文主要介绍使用javaswingmysql技术去开发实现一个办公用品管理系统。 功能分…

【JUC】三、集合的线程安全

文章目录 1、ArrayList集合线程安全问题分析2、解决方式一&#xff1a;Vector或synchronizedList( )3、解决方式二&#xff1a;CopyOnWriteArrayList 写时复制4、HashSet集合线程不安全的分析与解决5、HashMap集合线程不安全的分析与解决 1、ArrayList集合线程安全问题分析 对…

削峰填谷:居民小区电动汽车有序充电策略研究

摘 要&#xff1a;针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题&#xff0c;提出一种采用延迟充电的电动汽车有序充电控制策略&#xff0c;并在分析国内外电动汽车有序充电的研究现状后&#xff0c;设计了居民小区电动汽车有序充电策略的总体框架。…

体验家XMPlus收购NPSMeter,稳固体验管理行业“领头羊”地位

2023年9月30日&#xff0c;体验家XMPlus&#xff08;以下简称“体验家”&#xff09;成功完成了对NPSMeter的收购。此次收购是中国客户体验管理&#xff08;CEM&#xff09;赛道进入快速发展以来的首单收购&#xff0c;标志着体验家在CEM领域的进一步扩张&#xff0c;旨在继续完…

AcWing第129场周赛 - 5290. 重新分装 - 哈夫曼/贪心

解决这个问题前可以先把这三个问题想清楚 1、为什么可以使用哈夫曼树进行求解&#xff1f; 考虑逆操作 参考题解链接 2、为什么恰好是按照每堆所需要的数量分&#xff1f;针对某一堆&#xff0c;可以先分一部分吗&#xff1f; 首先这里按照每堆所正好含有的数量进行划分&#x…

Ribbon 负载均衡原理和策略

目录 一、Ribbon 是什么 二、Ribbon 负载均衡原理 三、Ribbon 负载均衡策略 四、Ribbon的应用场景 一、Ribbon 是什么 Ribbon是一个开源的、基于HTTP和TCP的客户端负载均衡工具&#xff0c;它提供了一个简单的、基于配置的负载均衡策略&#xff0c;可以帮助开发人员更轻松…

Go 命令行框架: 构建强大的命令行工具

引言 在软件开发中&#xff0c;命令行工具扮演着重要的角色。它们可以用于自动化任务、数据处理、系统管理等各种场景。而使用合适的命令行框架&#xff0c;可以帮助我们更轻松地构建和维护命令行工具。本文将介绍 Go 语言中一些流行的命令行框架&#xff0c;并讨论它们的特性…

HDU 1027:Ignatius and the Princess II ← next_permutation()

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid1027【题目描述】 Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5…

UITableView的style是UITableViewStyleGrouped

一般情况下&#xff0c;UITableViewStylePlain和UITableViewStyleGrouped是UITableView常用到的style&#xff0c; 之前都是用到的时候&#xff0c;遇到问题直接用度娘&#xff0c;差不多就够用了&#xff0c;今天在修复UI提出的间隙问题&#xff0c;来回改&#xff0c;总觉得…

k8s关于metadata、spec.containers、spec.volumes的属性介绍(yaml格式)

目录 一.metadata常用属性 二.spec.containers子属性介绍 explain pod.spec.containers给出的参考 1.command示例演示 2.env和envFrom示例演示 3.ports部分详解 4.resources部分详解 5.startupProbe格式演示 6.terminationMessagePath和terminationMessagePolicy格式演…

晶圆代工产能利用率下降,降价大战一触即发 | 百能云芯

晶圆代工行业正面临产能利用率的重大挑战&#xff0c;据悉&#xff0c;联电、世界先进和力积电等主要代工厂纷纷降低明年首季的报价&#xff0c;幅度高达两位数百分比&#xff0c;项目客户降幅更高达15%至20%&#xff0c;各大晶圆代工厂深陷产能利用率六成保卫战。 晶圆代工降价…

EDA实验----四选一多路选择器设计(QuartusII)

目录 一&#xff0e;实验目的 二&#xff0e;实验仪器设备 三&#xff0e;实验原理&#xff1a; 四&#xff0e;实验要求 五&#xff0e;实验内容及步骤 1.实验内容 2.实验步骤 六&#xff0e;实验报告 七.实验过程 1.创建Verilog文件&#xff0c;写代码 2.波形仿真 …

获取windows 操作系统 是 win7 还是 win10 32位 或者是 64 位

import platform# 获取操作系统信息 system_info platform.system()# 检测操作系统版本 if "Windows" in system_info:version_info platform.version()if "10" in version_info:print("Windows 10")elif "7" in version_info:print…

如何在苹果iOS系统ipa应用中获取当前版本号和Bundle ID

在iOS应用开发过程中&#xff0c;了解如何获取和使用应用的当前版本号、Bundle ID和其他相关信息是至关重要的。无论是在应用内显示这些信息&#xff0c;还是在编写一些版本依赖的逻辑时&#xff0c;掌握这些知识点都将帮助开发者进行更有效的管理和维护。本文将详细介绍如何在…

解读Sketching the Future (STF):零样本条件视频生成

Diffusion Models视频生成-博客汇总 前言:基于草图的视频生成目前是一个基本无人探索过的领域,videocomposer做过一些简单的探索。Sketching the Future从零样本条件视频生成出发,出色的完成了这一任务。这篇博客就解读一下《Sketching the Future (STF): Applying Conditio…

HarmonyOS应用开发-视频播放器与弹窗

Viedo组件 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能&#xff0c;媒体组件都是必不可少的。以视频功能为…

Python中连接池的分析和应用

连接池&#xff08;Connection Pool&#xff09;是在系统初始化的时候&#xff0c;将网络连接作为对象存储在内存中&#xff0c;当用户需要进行连接时&#xff0c;从连接池中取一个已经建立好的空连接对象&#xff0c;使用完后不关闭连接&#xff0c;将连接放回连接池&#xff…

【Vue原理解析】之虚拟DOM

Vue.js是一款流行的JavaScript框架&#xff0c;它采用了虚拟DOM&#xff08;Virtual DOM&#xff09;的概念来提高性能和开发效率。虚拟DOM是Vue.js的核心之一&#xff0c;它通过在内存中构建一个轻量级的DOM树来代替直接操作真实的DOM&#xff0c;从而减少了对真实DOM的操作次…

暖手宝上架亚马逊美国站UL499报告测试标准要求

暖手宝是运用物理及化学原理研制的自动取暖保健用品。该产品以其自动生热&#xff0c;有趣&#xff0c;实用等新颖独特的优势&#xff0c;深受欢迎——暖手宝具有自动取暖&#xff0c;理疗保健等多种功能。只要插上电源等上10分钟左右就能发热&#xff0c;最后一种是通过锂电池…

【华为OD题库-015】报文重排序-Java

题目 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓冲区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N,表示子报文的个数&#xff0c;0<N < 1000。 输入第二行为N个子报…