06makefile学习之三个自动变量($@,$^,$<),模式规则和静态模式规则

2023-10-26

06makefile学习之三个自动变量( @ , @, @,^,$<)和模式规则

以下为相关makefile的学习文章
01makefile学习之GCC编译的四个阶段(带编译阶段、汇编阶段、-S,-c的区别)
02makefile学习之makefile的基本原则
03makefile学习之makefile的一个规则
04makefile学习之多个规则处理多个文件
05makefile学习之两个函数和一个特殊规则clean
06makefile学习之三个自动变量(@ , @,@,^,$<)和模式规则
07makefile学习之习题1
08makefile学习之习题2

注:%表示代表一个或者多个字符。

1 三个自动变量
1) @ : 表 示 规 则 的 目 标 , 并 且 只 能 出 现 在 命 令 中 , 不 能 出 现 在 规 则 第 一 行 中 。 2 ) @:表示规则的目标,并且只能出现在命令中,不能出现在规则第一行中。 2) @2^:表示规则的所有依赖条件,用列表存储,若有重复则删除重复。
3)$<:表示规则的一个依赖条件。若改变量应用在模式规则中,它的值将为依次从列表取出的值。
例如:

解释1):
hello:$(obj) //不能将hello改成$@,因为只能出现在下面的命令行中。
	gcc $(obj) -o hello

对上一篇的makefile引入三个自动变量后如下(对比上一篇的makefile):
上一篇makefile:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src))

ALL:hello

hello:$(obj)
	gcc $(obj) -o hello
hello.o:hello.c
	gcc -c hello.c -o hello.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

clean:
	-rm -rf $(obj)

添加自动变量后:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","

ALL:hello

hello:$(obj)           #终极目标一般不需要替换,下面的中间目标可以替换;$(obj)可以使用$^代替,但最好不要
	gcc $(obj) -o $@   #"$@"只能用在命令行
hello.o:hello.c
	gcc -c $< -o $@
add.o:add.c
	gcc -c $< -o $@
sub.o:sub.c
	gcc -c $< -o $@
mul.o:mul.c
	gcc -c $< -o $@

clean:
	-rm -rf $(obj)

看到上面,除了第一组规则是完全符合当前路径的文件增加能自适应,其它都还不行,怎么看呢?因为这些规则的第一行的目标和依赖都是固定文件名。
例如增加aa.c,必须增加一组规则,其它规则不能帮他自动增加。

2 使用模式规则,解决当前路径增加文件后,makefile能自动适应编译
模式规则:多组规则使用同一命令生成目标文件。
添加三个自动变量后我们仔细观察可以发现那四组规则的规律,如下:

hello.o:hello.c
	gcc -c $< -o $@
add.o:add.c
	gcc -c $< -o $@
sub.o:sub.c
	gcc -c $< -o $@
mul.o:mul.c
	gcc -c $< -o $@

它们都是用同一命令将.c文件生成.o文件,也就是说它们的模式规则为以下命令:

%.o:%.c	                //%表示代表一个或者多个字符
	gcc -c $< -o $@		//注意,"$<"的值会变,为依次从$(obj)列表取出的值。

所以增加模式规则后的makefile文件为:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","

ALL:hello

hello:$(obj)
	gcc $(obj) -o $@
%.o:%.c
	gcc -c $< -o $@

clean:
	-rm -rf $(obj)

3 静态模式规则
其实上面的makefile也算是可以使用的makefile了,这里讲静态模式规则是使它更为完整。
静态模式规则:指定当前makefile使用哪一种模式规则。格式是只需要在模式规则的那组规则的第一行中添加$(obj)和冒号即可。

例如下面有两种(组)模式规则:

%.o:%.c
	gcc -c $< -o $@
%.o:%.s
	gcc -c $< -o $@

当我在当前目录增加一个div.c时,由于存在多组模式规则,makefile是无法分清要使用哪一种的,即使我们知道后缀是.c,但是makefile不知道啊,所以我们需要静态模式规则来指定使用哪一种模式。
添加静态模式规则:

$(obj):%.o:%.c		//指定使用该组模式规则
	gcc -c $< -o $@
%.o:%.s
	gcc -c $< -o $@

所以添加静态模式规则的makefile写法为:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","

ALL:hello

hello:$(obj)
	gcc $(obj) -o $@
$(obj):%.o:%.c
	gcc -c $< -o $@

clean:
	-rm -rf $(obj)

4 额外增加调试信息和警告信息
非常简单,只需要定义一个变量,将选项值赋给它即可。
例如

debug = -Wall -g

所以从01篇到06本篇完整的makefile写法为:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","

debug = -Wall -g

ALL:hello

hello:$(obj)
	gcc $(obj) -o $@
$(obj):%.o:%.c
	gcc -c $< -o $@ $(debug)

clean:
	-rm -rf $(obj)

注意,因为我们只需要检查语法和调试信息,所以只需要在-c中添加即可,链接不需要。

好了,makefile的学习到此结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

06makefile学习之三个自动变量($@,$^,$<),模式规则和静态模式规则 的相关文章

随机推荐

  • 走过2011

    走过2011 时间飞逝 2011不寻常的一年还剩下短短5天 三百天的生活与工作是一份平淡一份快乐 工作需要总结 生活也要总结 日子才会越来越好 2011是进入公司的第二年 公司开发人员有来有离 我没有离开 因为我不喜欢跳槽 但我不跳槽的主要
  • Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from

    程序在编译时报错 在执行合并AndroidMainfest时报Attribute application appComponentFactory value android support v4 app CoreComponentFacto
  • Property ‘xxx‘ does not exist on type ‘xxx‘报错解决

    用ts写一个组件的时候 遇到了Property increment does not exist on type Add 的红点儿报错 但神奇的是竟然还能正常运行 在参考一些正确的代码后 有两个解决方案 在export default cl
  • P1048 采药(C++)---01背包(动态规划)解题

    题目描述 辰辰是个天资聪颖的孩子 他的梦想是成为世界上最伟大的医师 为此 他想拜附近最有威望的医师为师 医师为了判断他的资质 给他出了一个难题 医师把他带到一个到处都是草药的山洞里对他说 孩子 这个山洞里有一些不同的草药 采每一株都需要一些
  • MathJax 3 配置和上手渲染数学公式及在Vue中的使用

    mathjax是一个用于latex mathml和ascimath表示法的开源javascript显示引擎 mathjax的3 0版是对mathjax的彻底重写 实现了组件化 可以实现不同需求的定制 使用和配置与mathjax2版本有很大的
  • 【redis】Redis cluster是AP架构还是CP架构?

    最近刚好在看CAP理论 加上之前分析的redis cluster 就在想redis的cluster是什么模式的 AP还是CP 首先还是简单讲下CAP 具体的可见 CAP分别是 强一致性 Consistency 可用性 Availabilit
  • 地址栏参数隐藏

    1 result type 的redirectAction改为chain 但要注意如果是登录方法 权限拦截器中就可能会影响 2 将参数放到作用域中 比如session 注意 1 这样的注释是没用的
  • 网络编程13——epoll事件模型:ET和LT模、掌握实现epoll的ET模式(非阻塞模式

    epoll是linux下多路复用IO select poll 的增强版本 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 因为它会复用文件描述符集合来传递结果为不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文
  • shiro认证机制及认证原理

    转自 shiro认证机制 认证原理 下文笔者将讲述shiro的认证机制及认证原理 如下所示 Shiro认证 验证用户身份的过程 在认证过程中 用户需要提交实体信息 Principals 和凭据信息 Credentials 以检验用户是否合法
  • 【玩转PointPillars】Ubuntu18.04上部署nutonomy/second.pytorch

    系统环境 Ubuntu18 04 cuda10 2 GeForce GTX 1650 今天部署的项目虽然名称上叫做second pytorch 实际上是PointPillars的作者fork自SECOND项目 并作了改动之后形成的Point
  • 词法分析器构造工具Flex基础学习

    Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Pattern 模式一般用正规表达式进行精确描述 FLEX通过读取一个有规定格式的文本
  • SVN 服务器发送了意外的返回值(405 Method Not Allowed),在响应 “MKCOL” 的请求

    先转载一段网上说的解决方法 svn 405 Method Not Allowed 在响应 MKCOL 的请求 I managed to solve the problem Delete the parent s directory of t
  • jupyter lab的目录调整及默认浏览器设置为chrome

    Jupyter lab 的目录调整及默认浏览器设置为chrome 1 Jupyter 默认目录调整 首先要找到jupyter生成的配置文件 jupyter notebook config py 如果没有 在 anaconda prompt
  • 在Anaconda中快速安装OpenCV for Python

    一 下载和安装Anaconda Anaconda下载地址 Anaconda Individual EditionAnaconda s open source Individual Edition is the easiest way to
  • 【吐血整理】java程序员推荐轻薄笔记本

    正文 在写这个文章之前 我花了点时间 自己臆想了一个电商系统 基本上算是麻雀虽小五脏俱全 我今天就用它开刀 一步步剖析 我会讲一下我们可能会接触的技术栈可能不全 但是够用 最后给个学习路线 Tip 请多欣赏一会 每个点看一下 看看什么地方是
  • kali Linux自带firefox ESR设置代理

    1 打开kali的火狐浏览器 找到右上角的 三个杠 在点击 preferences 2 general gt network proxy gt setting 3 打开靶场和burp suite工具 注意火狐浏览器的代理是启动状态 靶场地址
  • 双写绕过的原理

    可以看到代码对key进行了过滤 那怎么办呢 可以构造kekeyy 当key被过滤掉时 剩下的字符自动拼接在一起 就形成了key 所以说 这样就可以拿下flag了
  • 梯度下降(学习笔记)

    应用 梯度下降法 Gradient Descent 又称最速下降法 是迭代法的一种 可用于求解机器学习算法的模型参数 即无约束优化问题 具体来讲可用来求解损失函数的最小值 也可求解最小二乘问题 分类 批量梯度下降 BGD 使用全部样本构建了
  • 职场大佬常用工具:Baklib,一款个人知识笔记管理神器

    又到了大家喜爱的好用工具推荐环节 今天我要给大家推荐一款个人知识笔记管理神器 不出你们所料 它就是Baklib 言归正传那Baklib究竟能干啥呢 引用官网的一句话来说 Baklib工具可以将大家日常工作学习中 存储到电脑 云盘上的文档 知
  • 06makefile学习之三个自动变量($@,$^,$<),模式规则和静态模式规则

    06makefile学习之三个自动变量 lt 和模式规则 以下为相关makefile的学习文章 01makefile学习之GCC编译的四个阶段 带编译阶段 汇编阶段 S c的区别 02makefile学习之makefile的基本原则 03m