当前位置: 首页 > news >正文

【Linux】自动化构建--make/Makefile

目录

  • 前言
  • 一、认识make/Makefile
    • 1. make/Makefile的使用
    • 2. make指令和Makefile的依赖关系和依赖方法
  • 二、Makefile基本语法
    • 1. Makefile推导过程
    • 2. 项目清理
    • 3. .PHONY如何做到总是被执行的
    • 4. stat指令的ACM时间
  • 三、Makefile语法细节

前言

【Linux】Linux编译器–gcc详情点击查看,今天继续介绍【Linux】自动化构建–make/Makefile

make是⼀条命令,makefile是⼀个文件,两个搭配使用,完成项目自动化构建

一、认识make/Makefile

1. make/Makefile的使用

  1. 使用touch指令创建文件Makefile
  2. vim打开Makefile写入内容 在这里插入图片描述
  3. 输入make指令(make会在当前目录下找名字叫“Makefile”或“makefile”的文件)在这里插入图片描述

2. make指令和Makefile的依赖关系和依赖方法

  • 依赖关系:test.exe可执行文件的形成依赖test.c文件
  • 依赖方法:形成test.exe可执行文件需要怎样的操作才能让test.c文件生成可执行文件,这个时候就有了依赖方法
  • 依赖方法的代码前面的空格必须使用Tab空格
  • 注意:依赖关系和依赖方法必须是合理的
    在这里插入图片描述

二、Makefile基本语法

1. Makefile推导过程

  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并
    报错,对于所定义的命令的错误,或是编译不成功,make根本不理
    在这里插入图片描述
    在这里插入图片描述

2. 项目清理

  1. ⼀般clean的目标文件,我们将它设置为伪目标,用.PHONY 修饰,.PHONY是Makefile内部的类似于关键字,它的作用是声明一个符号(clean、clear等),这个clean是一个目标文件,所以它也得有对应的依赖关系和依赖方法
  2. 依赖关系必须存在,但依赖关系列表可以为空
  3. 依赖方法可以是任何shell命令
  4. clean目标只是利用make的自动推导能力来让其执行rm命令,在构建工程的视角看起来就是清理项目,其本质就是删除不需要的临时文件

在这里插入图片描述

为什么清理clean,要用make clean,编译成可执行文件test.exe直接make或者make test.exe都行?

  • make命令后面跟目标名执行该目标名的依赖方法
  • make默认只会推导一条完整的推导链路
  • make默认只会推导第一个依赖关系对应的推导链,如果我们将clean的依赖关系和依赖列表放在文件前面,那么clean直接make就会执行,形成可执行文件test.exe就必须要make test.exe才可以,但是我们一般将clean放在后面
    在这里插入图片描述

.PHONY是用来修饰目标文件是一个伪目标,伪目标的本质是:总是被执行的。为什么make/make test.exe只能执行一次,第二次执行就像下面图片展示(告诉我test.exe是最新的)的那样不让反复执行了,但是make clean就能反复执行?

在这里插入图片描述
在这里插入图片描述

  • 当我们将test.exe文件用.PHONY修饰时,我们发现make/make test.exe就像clean一样能被反复连续执行了,这就是.PHONY的本质:总是被执行的

在这里插入图片描述

在这里插入图片描述

.exe不用.PHONY修饰,本质加速编译的效率

  • 如果在一个项目中有很100多个.c文件,我们只改了其中一个.c文件,如果使用.PHONY修饰,那么每修改一点代码,这100多个.c文件都需要重新编译链接,这样效率就会很低,默认情况下如果原文件没有修改过,直接使用原编译的.exe可执行文件就可以了

gcc怎么判断是否是老代码?

  • 我们的test.c文件的创建时间是比他的可执行文件test.exe创建时间要早的(如果源文件的修改时间比可执行文件的时间早,那么说明该文件在生成可执行文件后没有修改过,不需要重新编译,反之说明修改过,需要重新编译)
    在这里插入图片描述

3. .PHONY如何做到总是被执行的

上面我们已经说过通过比较源文件和可执行文件的修改时间(Modify时间)来确定是否需要重新编译,我们可以通过stat 文件名查看文件的时间信息
在这里插入图片描述
从上面可以看出源文件修改时间比可执行文件时间早,因此后面我们无法再次编译,那么我们有什么办法能再次编译呢?

  • 修改代码
  • 使用touch指令,能够更改文件的时间
    从图片结果可以看出源文件修改时间从16:12:12--->20:09:14,再次make允许编译
    在这里插入图片描述
    在这里插入图片描述
    总结:.PHONY能做到总是被执行的原因是:让gcc或者对应的指令忽略Modify时间对比新旧(有些指令不关心时间)

4. stat指令的ACM时间

文件 = 文件内容 + 文件属性
Modify:对文件内容做更改的时间
Change:对文件属性做更改的时间
在这里插入图片描述

  • 下面结果中我们可以看到,使用vim修改了文件内容,但是Modify和Change时间都被修改了,为什么?
    因为更改文件内容,会影响文件大小,且文件的Modify也是文件属性
    在这里插入图片描述

Access:表示文件最近被访问的时间(查文件内容或属性都叫做访问文件:cat && stat,access更偏向于访问文件内容),但是我们发现我们使用cat指令访问文件后Access时间有的时候会更改,有的时候不会更改,为什么?

  • 因为文件内容和文件属性如果更改了都必须在磁盘上刷新(如果不在磁盘上刷新,此时电脑关机,那么更改的文件将没有了)
  • 文件查看的比重比文件修改的比重大(修改文件内容也得打开文件后才能修改)
  • 如果每次查看都更新Access时间,那么文件属性就会被更改---->刷新到磁盘---->会增加访问磁盘的次数(磁盘是外设,效率低)---->OS整体效率降低
    访问文件内容,特定次数后才会更新一次时间

三、Makefile语法细节

  1. 回显问题

执行make指令,我们发现Makefile中的指令也会回显出来,怎么让回显不显示呢?Makefile中在指令前面加入@
在这里插入图片描述
在这里插入图片描述

  1. Makefile的规范写法
  • $@ 和 $^:@ 和 ^是变量, $@对应目标文件, $ ^对应的是目标文件的依赖文件列表 在这里插入图片描述

  • %.o:%.c:%的作用将该目录下的.o和.c文件展开
    在这里插入图片描述

  • $<:将冒号左边的文件一个一个的拿过来
    在这里插入图片描述

  • {x…xx}:现在我们创建100个.c文件,使用指令touch test{1..100}.c,使用rm test{1..100}.c删除这100个文件
    在这里插入图片描述
    现在怎么编译这100个文件呢?
    将这100个文件编译成.o文件后,再统一链接成可执行文件
    在这里插入图片描述
    我们还可以进一步的替换gcc、echo、rm,这样只需要修改文件头部的内容就可以通用
    在这里插入图片描述
http://www.dtcms.com/a/399097.html

相关文章:

  • 建设银行手机网站wordpress电台
  • 同一种激光模式 高阶模式的产生会降低基模的功率吗 能降低多少?
  • 设计模式-责任链模式详解
  • CentOS7安装mysql最简单教程
  • 垂直网站建设方案南庄建网站服务
  • 【LVS入门宝典】LVS DR模式深度解析:直接路由(DR)的高性能秘诀,MAC地址欺骗与ARP隔离
  • 自做网站视频潍坊免费网站制作
  • 代理通讯篇无外网或不可达SockS全协议规则配置C2正反向上线解决方案
  • 做网站麻烦吗网页创意与设计50例
  • 建筑公司网站需求h5个人网站代码
  • Qwen-image-edit在ComfyUI部署使用
  • 跨云镜像迁移实战:阿里云 → 腾讯云
  • 二、更新源(阿里云)(更新成阿里云后,再执行上面的系统更新)
  • 域名访问网站怎么下载书籍设计网站推荐
  • Playwright UI自动化实战速成指南
  • 【11408学习记录】考研数学线性代数核心突破:初等变换与初等矩阵完全攻略
  • 两学一做知识竞赛试题网站怎样做营销型网站推广ppt
  • 在HTTP请求上运行SQLMap靶机(打靶记录)
  • 全球外贸网站排名wordpress 媒体播放
  • wordpress 多站点配置文件市场调研公司是做什么业务的
  • Linux/Ubuntu 终端常用压缩工具XZ/BZip2/Gzip
  • 做网站的应用公司做网站要花多少钱
  • 医药行业从OCR到IDP的应用延申
  • 想自己做点飘纱素材到网站上买网站友情链接连接
  • 企业级一体化信创DevOps平台选型指南:如何平衡效率、安全与合规?
  • 网站页面打开速度哈尔滨网站营销推广
  • python+spingboot+vue学生宿舍报修及缴费系统 故障报修 工单处理 在线缴费查询 后勤服务管理平台 报修申请+缴费记录+维修进度跟踪系统
  • 汽车网络安全 CyberSecurity ISO/SAE 21434 测试之三
  • 超级分享 局域网文件互传 Easy Share WiFi File Transfer v1.5.22 解锁高级会员版
  • Redis 监听过期Key