百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Linux下Makefile文件的模式规则和自动化变量

lipiwang 2024-11-27 17:15 10 浏览 0 评论

在上一篇文章中我们编写了一个 Makefile 文件用来编译工程,这个 Makefile 的内容如下:

1 main: main.o input.o calcu.o
2 gcc -o main main.o input.o calcu.o
3 main.o: main.c
4 gcc -c main.c
5 input.o: input.c
6 gcc -c input.c
7 calcu.o: calcu.c
8 gcc -c calcu.c 
9 clean:
10 rm *.o
11 rm main

上述 Makefile 中第 3~8 行是将对应的.c 源文件编译为.o 文件,每一个 C 文件都要写一个对应的规则,如果工程中C 文件很多的话显然不能这么做。为此,我们可以使用 Makefile 中的模式规则,通过模式规则我们就可以使用一条规则来将所有的.c 文件编译为对应的.o 文件。

模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%”表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。

当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,使用方法如下:

%.o : %.c
命令

因此前面的 Makefile 可以改为如下形式:

1 objects = main.o input.o calcu.o
2 main: $(objects)
3 gcc -o main $(objects) 
4 %.o : %.c
5 #命令 
6 clean:
7 rm *.o
8 rm main

修改以后的 Makefile 还不能运行,因为第5 行的命令我们还没写呢,第 5 行的命令我们需要借助另外一种强大的变量—自动化变量。

上面讲的模式规则中,目标和依赖都是一系列的文件,每一次对模式规则进行解析的时候都会是不同的目标和依赖文件,而命令只有一行,如何通过一行命令来从不同的依赖文件中生成对应的目标?自动化变量就是完成这个功能的!所谓自动化变量就是这种变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该出现在规则的命令中,常用的自动化变量如下图所示:

图中的 7 个自动化变量中,常用的三种:$@、lt;和$^,我们使用自动化变量来完成前面的 Makefile,最终的完整代码如下所示:

1 objects = main.o input.o calcu.o
2 main: $(objects)
3 gcc -o main $(objects) 
4 %.o : %.c
5 gcc -c lt; 
6 clean:
7 rm *.o
8 rm main 

上述代码代码就是修改后的完成的 Makefile,可以看出相比文章开始的Makefile的要精简了很多,核心就在于第 4、5 这两行,第 4 行使用了模式规则,第 5 行使用了自动化变量。

相关推荐

怀孕生孩子那些事 之 小剂量阿司匹林为什么是81mg?

作者:段涛无论是在内科还是妇产科,阿司匹林都是常用药物。在看国外文献以及药物说明书的时候,或者是在海外代购药物的时候,大家都会有一些小小的疑问,就是为什么这些国外阿司匹林的剂量经常不是整数?阿司匹林剂...

国际临床试验发现 将三种心脏病药物组合成一粒药丸更有效果

一项大型国际临床试验发现,与分别服用每种药物相比,将三种常见的心脏病药物组合成一粒药丸在预防心血管事件和死亡方面明显更有效。在新试验中测试的治疗方法称之为Trinomia,使用由3种药物混合而成...

如何看懂医生写的处方字?

解码处方:从“天书”到清晰指引当我们拿到医生开具的处方,面对那密密麻麻、看似潦草的字迹,往往会感到困惑。医生的处方字似乎自成一体,宛如神秘的“天书”,但这背后其实是有迹可循的,只要掌握了正确的方法,...

当归全身都是宝!一碗黄芪当归补血汤,打造红润好气色,收藏备用

当归别名秦归、云归,外形类似人参,是伞形科植物当归的干燥根,《本草纲目》提到,“古人娶妻为嗣续也,当归调血为女人要药,为思夫之意,故有当归之名。”从当归鸭、当归羊肉到中药四物汤、生化汤,当归食药两...

14张菌落图"撞脸"他人文献!贵州某三甲医院研究成果遭质疑

2019年5月,贵州省人民医院在TranslationalCancerResearch(IF1.4999/4区)期刊上发表了一篇论文。在发表6年后,因图片与早期论文图片重复在pubpeer上被读者...

阿司匹林的各种剂型,有什么区别吗?听医生说说看

无论是在内科还是妇产科,阿司匹林都是常用药物。为什么这些国外阿司匹林的剂量经常不是整数?在看国外文献以及药物说明书的时候,或者是在海外代购药物的时候,大家都会有一些小小的疑问,就是为什么这些国外阿司匹...

医生讲解如何正确应用阿司匹林,控制冠心病的发展进程,改善症状

谈及冠心病的临床控制和干预,永远绕不开阿司匹林,它是冠心病患者最熟悉的药物,绝大多数病人都吃过阿司匹林,可以说是控制冠心病的基石,贯穿了患者的前中后期,需要特别慎重。阿司匹林是什么?阿司匹林(Aspi...

测绘专业!EI会议选刊口诀必看!

推荐EI会议会议名称:IEEE国际地理信息与遥感技术研讨会(IGIRS)截稿时间:即日起至11月30日时间地点:次年3月15-17日·新加坡论文集上线:会后2个月内提交至IEEEXplore版...

解码运营诉求:一对一直播源码如何实现"用户增长到付费转化"?

在竞争激烈的一对一直播交友赛道,用户增长和付费转化是决定产品成败的两大核心指标。然而,许多团队面临一个共同困境:用户进来了,但留不住、难付费。问题的根源往往在于源码架构是否深度适配运营需求。山东布谷科...

计算机EI源刊论文投稿秘籍|审稿周期解析

期刊推荐:《IEEETransactionsonComputers》-刊号:ISSN0018-9340-影响因子:3.7(最新数据)-分区:中科院2区,JCRQ1-版面费:非开源免...

学习人工智能AI所需的数学基础

人工智能(AI)的快速发展离不开数学理论的有力支撑。不管是构建神经网络模型,亦或是优化算法性能,乃至处理高维数据的不确定性,数学皆充当着核心要角。此文将自核心数学领域起始,详尽剖析其与AI的关联所...

化学工程亲测!EI会议高通过率

高录用率EI会议推荐会议名称:InternationalConferenceonChemicalEngineeringandApplications(CCEA)会议编号:CCF-C...

DDD编程入门指南

什么是DDD编程?领域驱动设计(Domain-DrivenDesign,简称DDD)是一种软件开发方法论,由EricEvans在其2003年的著作《领域驱动设计:软件核心复杂性应对之道》中提出。D...

软件工程?EI会议录用潜规则!

【推荐会议】ICSEA2025(会议号:61205)截稿时间:2025年4月10日召开时间与地点:2025年8月22-24日·美国波士顿论文集上线:会后3个月内提交至SpringerLN...

安全漏洞之经典上传漏洞

0x01概要说明文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识。俗话说,知己知彼...

取消回复欢迎 发表评论: