Makefile的简单语法学习

通配符

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

test : a.o b.o
	gcc -o test $^

%.o : %.c
	gcc -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 ?= weidongshan

all:
	@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 abc

dep_files = $(patsubst %.c, %.d, $(files2))

all:
        @echo dep_files = $(dep_files)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云服务器多少钱一年?2023年腾讯云优惠云服务器推荐

作为一名程序员&#xff0c;技术的突飞猛进是从拥有第一台云服务器开始的。那时&#xff0c;我开始尝试使用Linux系统&#xff0c;并成功上线了自己的第一个小程序。自此之后&#xff0c;我和我的同事们都开始拥有自己的云服务器&#xff0c;用来搭建各种小项目或者好玩的东西。…

ubuntu操作系统的docker更换存储目录

前言 要将Docker的存储目录更改为/home/docker&#xff0c;你需要进行以下步骤&#xff1a; 目录 前言1、停止Docker服务2、创建新的存储目录3、编辑Docker配置文件4、启动Docker服务5、验证更改 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&…

多语言TTS:Multilingual speech synthesis

文章目录 [Learning to Speak Fluently in a Foreign Language:Multilingual Speech Synthesis and Cross-Language Voice Cloning](https://arxiv.org/abs/1907.04448)[2019interspeech][google][Improving Cross-lingual Speech Synthesis with Triplet Training Scheme](htt…

107.am40刷机折腾记3-firefly镜像的烧写

1. 平台&#xff1a; rk3399 am40 4g32g 2. 内核&#xff1a;firefly的内核&#xff08;整体镜像&#xff09; 3. 交叉编译工具 &#xff1a;暂时不编译 4. 宿主机&#xff1a;ubuntu18.04 5. 需要的素材和资料&#xff1a;boot-am40-20231113.img(自编译) 准备的情况&a…

四点定球-克拉默法则

一、原理 使用克拉默法则进行四点定球 - 知乎 二、代码实现 c /// <summary> /// 四个不共面的点 用克拉默法则 计算球心和半径 /// </summary> /// <param name"p1"></param> /// <param name"p2"></param> /// &l…

考前须知-2024年上半年系统集成项目管理工程师

可以看看23年下半年软考集成考试的难度 一、考试时间安排&#xff1a; 集成考试一年会考2次&#xff0c;上半年一次、下半年一次。考试时间4h&#xff0c;分批进行 系统集成项目管理工程师教材共655页&#xff0c;分为23章。其中,前3章为信息化与系统集成基础知识的内容,第4章…

阿里回应多款应用崩了

在11月12日晚间&#xff0c;一场突如其来的故障席卷了阿里云&#xff0c;导致包括淘宝、钉钉、阿里云盘在内的多款应用无法正常使用。这场故障引起了用户和业界的广泛关注&#xff0c;许多用户纷纷在社交媒体上表达了对此的不满和担忧。据用户反馈&#xff0c;当晚突然发现包括…

python中的字符串转字节码

res int.from_bytes(hello.encode(), byteorderlittle)res的结果为478560413032&#xff0c;这个结果怎么计算得到的呢&#xff1f; 将hello的每个字母的ascii码从右往左排列&#xff0c;拼接起来转成十进制就是res的结果。 拼接的结果为&#xff1a;011011110110110001101100…

【Unity插件】2D模拟绳子的插件——Rope 2D Editor

文章目录 前言资源unity商店地址&#xff1a;我这里有一个比较老旧的版本&#xff1a; 使用创建绳子场景使用时效果 参考完结 前言 最近发现一个很有意思的插件Rope 2D Editor&#xff0c;这是一个简单而强大的 2d 绳索编辑器。这是我为我的游戏&#xff08;Dabdob&#xff09…

[WSL] 安装hive3.1.2成功后, 使用datagrip连接失败

org.apache.hadoop.ipc.RemoteException:User: xxx is not allowed to impersonate anonymous 下载driver-hive-jdbc-3.1.2-standalone 解决 修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项 <property><name>hadoop.proxyuser.你的用户名.hosts…

Postgresql数据类型-数组类型

PostgreSQL支持一维数组和多维数组&#xff0c;常用的数组类型为数字类型数组和字符型数组&#xff0c;也支持枚举类型、复合类型数组。 数组类型定义 先来看看数组类型的定义&#xff0c;创建表时在字段数据类型后面加方括号“[]”即可定义数组数据类型&#xff0c;如下所示…

全志R128平台SPI与DBI点屏性能大对比

SPI 与 DBI 性能对比 R128 平台的 SPI 接口参数如下 全双工同步串行接口Master/Slave模式可配置支持最大96MHz时钟频率支持SPI Mode0/1/2/3片选和时钟的极性和相位可配置5个时钟源支持中断或DMA传输支持多片选支持Standard Single/Dual/Quad SPI&#xff0c;FIFO深度64B支持B…

Qt高级--(1)自定义导航栏

好久没有水博客&#xff0c;参考别人的写一个自定义的导航栏吧。用处挺多的&#xff0c;可以用来切换到不同的信息显示界面。 功能点 1.默认情况下&#xff0c;文字居中显示&#xff0c;不显示图标&#xff0c;不显示三角。 2.可设置文字左侧、顶部、右侧、底部边距&#xff…

功率放大器在微流控测试中的应用有哪些

微流控技术是一种在纳米或微米尺度上操作和控制流体的技术&#xff0c;它在生物医学、化学分析和材料科学等领域具有广泛的应用前景。然而&#xff0c;由于微流控系统中涉及到的流体操作和流动过程往往需要较高的电压和电流&#xff0c;因此在微流控测试中常常需要使用功率放大…

网络问题导致pycharm无法提交代码到代码仓库

现象 ssh: Could not resolve hostname github.com: Name or service not known fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 原因及解决办法 可能不是自己权限有问题&#xff0c;而是…

伦敦银为什么降价

作为贵金属家族中的一员&#xff0c;白银具有一定的金融属性&#xff0c;但它同时也是一种工业金属&#xff0c;在太阳能、汽车、电子工业上有着广泛的用途&#xff0c;所以其价格会受到诸多因素的影响。伦敦银作为紧密跟着国际现货白银价格走势的品种&#xff0c;其降价的原因…

Python高级语法----高级Python函数式编程

文章目录 1. 函数式编程概念2. 使用functools模块3. 深入理解lambda, map, filter, reduce函数a. lambda 函数b. map 函数c. filter 函数d. reduce 函数1. 函数式编程概念 函数式编程是一种编程范式,它将计算视为函数的评估,并避免使用程序状态及可变数据。在Python中,函数…

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f

软件外包开发的需求对接

软件外包开发的成功与否很大程度上取决于需求对接的有效性。以下是一些建议&#xff0c;可帮助您在软件外包开发中进行需求对接&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确业务目标和需求&…

个推用户运营全新上线用户生命周期管理功能,助力APP快速实现用户精细化运营

近期&#xff0c;个推用户运营上线了APP用户生命周期管理功能。该功能可以帮助APP多维度洞察⽤户所处的⽣命周期分布&#xff0c;旨在帮助运营人员快速全面地了解用户&#xff0c;从而基于用户生命周期针对性地做出用户运营策略调整&#xff0c;提升用户价值和运营指标。 个推如…