【Linux】07.Linux 下的项目自动化构建工具——make/makefile

前言

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

一、认识make和makefile

1.1 编译文件

在这里插入图片描述
在这里插入图片描述
我们可以看到make指令之后就自动生成了code文件

接下来对各个部分进行解释:
在这里插入图片描述

1.2 清理文件

在这里插入图片描述
在这里插入图片描述
我们看到make指令就对code进行了清理

接下来对清理部分进行解释:
在这里插入图片描述

1.3 make的原理

上述的代码本质上应该是这样的:
在这里插入图片描述

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“code”这个文件,并把这个文件作为最终的目标文件。
  3. 如果code文件不存在,或是code所依赖的后面的code.o文件的文件修改时间要比code这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成code这个文件。
  4. 如果code所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,如果找到则再根据那一个规则生成code.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成code.o 文件,然后再用code.o 文件声明make的终极任务,也就是执行文件code了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

二、.PHONY 是什么

2.1 认识 .PHONY

.PHNOY 可以理解成 makefile 中声明伪目标的关键字

主要作用是让目标文件的依赖方法总是被执行,下面来证明一下:
在这里插入图片描述
通过是否给code文件添加 .PHONY 我们可以看出没有.PHONY时我们的文件在make时就会显示文件已经是最新编译状态,并没有生成新的文件。

可能这时候就会有人来测试给clean去掉 .PHONY ,然后测试发现不管有没有.PHONY,make clean 指令总是能执行的,这就不得不谈一谈.pHONY的原理了。

2.2 .PHONY的原理

我们现在就想知道.PHONY是怎么实现的,为什么有的时候依赖关系就是可以多次执行,而有些时候依赖关系就不执行了。
其实归结到根本,.PHONY 是通过时间判断的,当源文件的更改时间小于可执行程序的修改时间时就不会执行了,这也恰恰符合了我们的预期:既然文件是最新的那就自然不需要更新了

接下来我们就来验证一下我们上面的话是否是正确的:
使用stat指令即可查看文件的属性信息
我们可以看到三种时间:Access、Modify、Change
他们分别代表着什么意思呢?
在这里插入图片描述
在这里插入图片描述
我们看到此时的源文件修改时间是小于可执行程序的,.PHONY就是通过比较源代码产生的时间与可执行程序产生的时间来决定是否进行编译的。

这时候又会有人问了:那为什么clean在去点.PHONY之后他还是可以被多次执行呢?
这是因为 clean里的依赖方法不被时间所强制限定

三、进一步认识makefile

  1. makefile文件会被make从上到下的的进行扫描,第一个目标名是可以缺省的,如果我们像执行其他的依赖关系、依赖方法,使用 make+目标名称
  2. 对于我们执行的makefile时总是会打印我们的指令的信息,我们可以通过在指令前加入@的方式来只显示执行结果

在这里插入图片描述

  1. makefile会自动推导的,一直推导过程,把方法进栈,直到推导到依赖文件存在,然后逆序实现所有的依赖方法,上面演示过了
  2. 更普适的写法:
    在这里插入图片描述
  3. makefile默认一次只生成一个可执行程序,我们如何才能一次生成多个可执行程序呢?
    在这里插入图片描述
    我们只需要使用伪目标操作即可。

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

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

相关文章

【Datawhale X 李宏毅苹果书 AI夏令营】Task1笔记

第三章:深度学习基础 3.1 局部极小值与鞍点 临界点,即梯度为零的点,包含局部极小值(local minimum)和鞍点(saddle point)。 梯度下降算法在接近鞍点的时候会变得非常慢,阻碍了继续…

机器学习:K-means算法(内有精彩动图)

目录 前言 一、K-means算法 1.K-means算法概念 2.具体步骤 3.精彩动图 4.算法效果评价 二、代码实现 1.完整代码 2.结果展示 3.步骤解析 1.数据预处理 2.建立并训练模型 3.打印图像 四、算法优缺点 1.优点 2.缺点 总结 前言 机器学习里除了分类算法&#xff0…

如何使用ssm实现计算机科学与技术学习网站的设计与开发

TOC ssm248计算机科学与技术学习网站的设计与开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化&…

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块 前言一、资源来源二、实践步骤1.修改OH内核并编译2.动态库增加welog打印3.设备验证打完收工 总结参考 前言 最近在搞OpenHarmony4.0蓝牙模块的适配,最主要的工作就是在libbt_vendor.z.so这个库的编写修改&am…

AWS 使用 Amazon EC2 控制台安装和配置 CloudWatch 代理以添加其他指标如内存

默认情况下,Amazon CloudWatch 提供基本指标(例如 CPUUtilization 和 NetworkIn)用于监控 Amazon EC2 实例。要收集其他指标,您可以在 EC2 实例上安装 CloudWatch 代理,然后将该代理配置为发出所选指标。您可以使用 Am…

网络安全售前入门04——审计类产品了解

目录 1.前言 2.数据库审计介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统售前入门(安全产品,安全服务,法律法规等)文章介绍,希望能给初进网安职场的小伙伴提供…

【Qt】Qt系统 | Qt事件 | 定时器

文章目录 定时器QTimerEventQTimer获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些动作,或者制作一些动画效果,使用定时器可以实现这些需求。 定时器,会在间隔一定时间后,执行某一…

Git下载安装配置

Git的下载与安装 Git是一种分布式版本控制系统,用于跟踪文件和文件夹的变化。它最初由Linus Torvalds开发,用于管理Linux内核的源代码。Git的设计目标是:速度快、开发效率高、数据完整性和可靠性强。 Git通过创建一个存储库(rep…

【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

什么领域/方向的产品经理既有发展前景又能做的长久

前几天我在知乎上回答了一道“目前什么领域的产品经理比较有发展前景?有推荐的课程吗?”的问题,讲得还比较实在,于是在这里也顺便分享一下。 TOP1.商业产品经理 之所以这个方向能排在第1,我认为有3点理由。 第1点&a…

国产游戏技术能否引领全球?

国产游戏技术:引领全球还是任重道远? 近年来,伴随着中国科技和经济的迅猛发展,国产游戏行业也呈现出蓬勃发展的态势。从《原神》到《黎明杀机手机版》,多款国产游戏在国际市场上崭露头角。而国产游戏在画面渲染、物理…

基于layui实现简单的万智牌生命计数器页面

对照手机App“旅法师营地”的万智牌生命计数器窗口(如下图所示),使用layui、jQuery等实现简单的万智牌生命计数器页面。   主要实现的功能如下:   1)点击左右两侧的-1、1、-5、5区域更新左右两侧生命值&#xff1…

短视频SDK解决方案,代码逻辑结构清晰,接入便捷

美摄科技凭借其在多媒体处理领域的深厚积累,推出了高效、易用的短视频SDK解决方案,为开发者及内容创作者提供了一站式的短视频创作与编辑工具,让每一份灵感都能轻松转化为引人入胜的视觉盛宴。 一、技术领先,打造极致体验 美摄科…

DNS详解

DNS详解 DNS 是一个域名系统,它主要用于将人类容易记忆的域名转换成ip地址。 默认情况下,设备会自动从网络供应商获取DNS服务器地址,并使用DNS服务器对域名进行解析。 此外,你也可以手动设置DNS服务器,具体操作系统…

反射机制简单基础

前序 在我们没有学习框架之前我们都是通给new来创建对象,如:创建一个我们已知的对象 Car carnew Car(); 调用类中的成员变量和成员方法都是对象直接调用。 在学习了mybatis框架后,我们了解到可以通过类名,能动态得到类中定义的…

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

量化四大邪术之一:般若波罗蜜

网络相传亚洲有四大邪术,日本化妆,韩国整容,泰国变X,Z国PS。 这些都是让人在颜值上看起来很美,类似地,在量化交易领域,也有四大邪术能让净值曲线看起来很美,今儿个来说量化四大邪术当…

一文弄懂MySQL中的锁

MySQL中的锁概述 MySQL中的锁机制是数据库管理系统用于控制并发操作的一种手段,主要用于保证数据的一致性和完整性。当多个事务同时操作同一数据时,锁机制可以防止数据冲突和确保事务的隔离性。 在MySQL中,锁可以分为三大类:全局…

前端自动导入依赖

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题&#xff0c;因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源&#xff0c;同时保持高度的安全性和合规性。以下是一些关键技术和实践方法&#xff0c;用于实现跨云环境下的自动化身份管理…