【Linux】make/makefile自动化构建工具

文章目录

  • 前言
  • 一、什么是make/makefile?
  • 二、依赖关系和依赖方法
    • 2.1 makefile中创建文件
    • 2.2 makefile中删除文件
    • 2.3 stat指令查看文件的三种时间(ACM)
    • 2.4 伪目标文件(.PHONY)
  • 三、Makefile中的一些特殊符号
    • 3.1 $@ 和 $^
    • 3.2@特殊符号
  • 总结


前言

本文章讲解Linux下的自动化构建工具:make/makefile


以下是本篇文章正文内容

一、什么是make/makefile?

  • 1.make是一条指令
  • 2.makefile是一个当前目录下的文件

二、依赖关系和依赖方法

2.1 makefile中创建文件

上代码解释什么是依赖关系和依赖方法

1 mycode:mycode.c
2     gcc -o mycode mycode.c   

先创建打开makefile文件,输入上面的代码。

  • 第一行代码的mycode在冒号左边,mycode.c在冒号右边,这一行叫做依赖关系
    mycode依赖于mycode.c。
  • 第二行代码开头需要空一个Tab键,这是语法规定。依赖关系所属的就叫做依赖方法

make指令会自动根据依赖关系和依赖方法生成对应的目标可执行程序。

为了进一步说明依赖关系和依赖方法,以下代码仅仅是为了说明,实际不建议这样写:

  1 mycode:mycode.o2     gcc -o mycode mycode.o                                                      3 mycode.o:m mycode   4     gcc -o mycode.o -c mycode.s5 mycode.s:mycode.i6     gcc -o mycode.s -S mycode.i7 mycode.i:mycode.c8     gcc -o mycode.i -E mycode.c

我们看到,这里又多种依赖关系和依赖方法。
其中,当我们退出makefile文件,直接执行make指令后,情况如下:在这里插入图片描述
这跟我们定义的依赖关系和依赖方法的顺序相反了!
在这里插入图片描述

实际上,make指令在扫描makefile文件时,会先找到第一个生成可执行目标程序,也就是mycode,然而,在当前目录中没有mycode的依赖关系:mycode.o,所以make会继续向下扫描,找到mycode.o的依赖关系:mycode.s,在当前目录下也没有mycode.s,make继续向下扫描,找到mycode.s的依赖关系:mycode.i,当前目录也没有mycode.i,则继续向下找mycode.i的依赖关系:mycode.c。此时找到了mycode.c,就会执行这份依赖关系所对应的依赖方法,也就是第8行的代码。自此从下往上一步步执行,直到生成第一个可以执行目标文件。
所以,只输入make命令,会默认找到第一个依赖关系。

所以我们在makefile文件中打乱各种依赖关系和依赖方法的顺序是可以的,只要能够被make指令查找到即可。

2.2 makefile中删除文件

我们生成了可执行程序后,假如我想把这过程的文件都删除了,可以在makefile文件中添加一个依赖关系和依赖方法,用来删除文件。

 clean:rm -f mycode mycode.i mycode.s mycode.o

执行make clean指令后,上面这些文件都会被删除。
在这里插入图片描述
可以看到,当我们执行完成后,mycode.i,mycode.s,mycode.o文件都会被删除。
这里有个问题:为什么需要输入make clean,而不是直接输入clean?
因为make指令默认寻找的是第一条依赖关系

第二个问题:当我第一次输入了make生成了一堆目标文件后,再次输入make,它就不给我执行了:
在这里插入图片描述
他说mycode是最新的,这是什么原因呢?

2.3 stat指令查看文件的三种时间(ACM)

我们使用

stat mycode

指令,查看mycode后,会出现三种时间

在这里插入图片描述
Access时间(访问时间)Modify时间(更改时间) Change时间:(改变时间)

这里的Modify和Change时间如何区分呢?
还记得

文件 = 文件内容 + 文件属性

Modify时间就是修改文件内容后,会更新到最新时间。
Change时间是修改文件属性后,会更新到最新时间。

Access是访问时间,一般只要我们打开一个文件,该文件的Access时间都会更新到最新时间。

那么为什么多次make,它不让执行呢?

为了提高编译效率。先有源文件,才有可执行,一般而言,源文件的最近修改时间比可执行程序要老。如果我们更改了源文件,历史上还曾经有可执行程序,那么源文件的最近修改时间,一定要比可执行程序新!
只需要比较源文件最近修改时间和可执行程序最近修改时间:
(1).exe 老于 .c文件,需要重新编译
(2).exe 新于 .c文件,不需要重新编译

实际上,我们拿这段代码到Linux上编译时,每次访问.c文件,都会发现,Access并不是每一次都更改!

原因:因为每一次更改Access的值,都需要到磁盘上更新,频繁地访问外设只会让整机的效率变低,Linux的设计者为了提高效率,可能是通过没隔几次Modify或Changed变了,Access才会更新。

可是,如果我就想让make每次都会执行呢?

2.4 伪目标文件(.PHONY)

这里就有一个伪目标文件如下,可以让make一直执行。

在这里插入图片描述
可以看到,当我们在.PHONY:后面加上可执行目标文件后,我们每次执行make,它都会执行,不会因为.exe文件比.c文件新就不执行。

但是实际中建议伪目标代码:.PHONY修饰clean,让clean一直可被执行。
因为有些编译器对增加的代码是叫做增量编译的执行方式,可能源文件的问题依 旧存在,我们需要强制清理,这就需要clean每次都被执行最好。

三、Makefile中的一些特殊符号

3.1 $@ 和 $^

在这里插入图片描述

有时候我们不想在依赖方法中写一大串东西,所以" $@ “符号可以代替依赖关系中,冒号前面所有的东西,也就是可以代替上述案例的mycode,” $^ "可以代替依赖关系中,冒号后面所有的东西,也就是mycode.o

在这里插入图片描述

所以可以这样操作。

3.2@特殊符号

有时候我们不想执行make命令后,下面跟着一大串的依赖关系。我们可以使用@符号加在依赖方法中,让它每次执行make命令后,不再冒出依赖方法。

在这里插入图片描述

总结

今天讲解了Linux的自动化构建工具。

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

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

相关文章

【深入理解ES6】字符串和正则表达式

概念 字符串(String)是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol(es6新增)。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种: 前 个码位均以16位的编码单元…

尚硅谷大数据项目《在线教育之离线数仓》笔记002

视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P025 P026 P027 P028 P029 P030 P031 P032 P033 P034 P035 P036 P037 P038 P025 在Hive所在节点部署Spark P026 3)Hive on Spark测试 (1)…

深度剖析数据在内存中的存储

目录 一、数据类型介绍 类型的基本归类 1.整形家族 2.浮点数家族 3.构造类型 (自定义类型) 4.指针类型 5.空类型 二、整形在内存中的存储 1.原码、反码、补码 1.1原码 1.2反码 1.3补码 1.4计算规则 2 .大小端介绍 三、浮点型在内存中的存…

C++函数模板和类模板

C另一种编程思想称为泛型编程,主要利用的技术是模板 C提供两种模板机制:函数模板和类模板 C提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类, 其类内部的类型和函数的形参类型不具体指定, 用…

算法与数据结构(七)--堆

一.堆 1.堆的定义 堆是计算机科学中一类特殊的数据结构的通常,堆通常可以被看做是一颗完全二叉树的数组对象。 堆的特性 1.它是完全二叉树,除了树的最后一层结点不需要是满的,其他的每一层从左到右都是满的,如果最后一层结点不…

WordPress更换域名后-后台无法进入,网站模版错乱,css失效,网页中图片不显示。完整解决方案(含宝塔设置)

我在实际解决问题时用到了 【简单暴力解决方案】的《方法一:修改wp-config.php》 和 【简单暴力-且特别粗暴-的解决方案】 更换域名时经常遇到的几个问题: 1、更换域名后,后台无法进入 2、更换域名后,网站模版错乱,c…

基于物理场的动态模式分解(piDMD)研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

stm32红绿灯源代码示例(附带Proteus电路图)

本代码不能直接用于红路灯,只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…

九耶丨阁瑞钛伦特-在项目中找到的经典BUG是什么?

在项目中找到的经典BUG有很多种,以下是其中一些常见的例子: 空指针异常(NullPointerException):当程序试图访问一个空对象或未初始化的变量时,会抛出空指针异常。这通常是由于缺少对变量的正确初始化或检查…

RabbitMq-发布确认高级(避坑指南版)

在初学rabbitMq的时候,伙伴们肯定已经接触到了“发布确认”的概念,但是到了后期学习中,会接触到“springboot”中使用“发布确认”高级的概念。后者主要是解决什么问题呢?或者是什么样的场景引出这样的概念呢? 在生产环…

第1天----验证一个字符串是否是另一个字符串的子串

本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。 一、小试牛刀: 题目描述 输入两个字符串,验证其中一个串是否为另一个串的子串。 输入格式 两行,每行一个字符串。 输出格式 若第一个串 s 1 是第二个串 s 2 的子串&#xff0c…

[Machine Learning] decision tree 决策树

(为了节约时间,后面关于机器学习和有关内容哦就是用中文进行书写了,如果有需要的话,我在目前手头项目交工以后,用英文重写一遍) (祝,本文同时用于比赛学习笔记和机器学习基础课程&a…

【java安全】Log4j反序列化漏洞

文章目录 【java安全】Log4j反序列化漏洞关于Apache Log4j漏洞成因CVE-2017-5645漏洞版本复现环境漏洞复现漏洞分析 CVE-2019-17571漏洞版本漏洞复现漏洞分析 参考 【java安全】Log4j反序列化漏洞 关于Apache Log4j Log4j是Apache的开源项目,可以实现对System.out…

SQL Server2019安装后使用SQL Server身份验证登录失败

错误情况 今天在电脑安装SQL Server2019和SMMS,安装过程一切顺利,但是在使用SMMS连接数据库时出现了异常。使用"Window 身份验证"登录时正常,但是如果改为使用"SQL Server 身份验证"登录时却连接失败! 解决方…

VS2022远程Linux使用cmake开发c++工程配置方法

文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…

js判断用户当前网络状态和判断网速

前端判断用户当前网络状态和判断网速 一、第一种是通过 HTML5 提供的 navigator 去检测网络(1)、原理介绍:(2)、兼容性 二、监听window.ononline和window.onoffline事件:三、通过ajax进行请求判断(兼容性好-推荐)(1)、原理介绍:(2)、注意: 四、navigator.connection方法监听网络…

13---内嵌HTML和React

虽然Markdown本身不支持内嵌HTML和React&#xff0c;但可以在Markdown文档中直接插入HTML代码和React组件。 一、在markdown中内嵌HTML 在Markdown中&#xff0c;你可以使用HTML标签来实现更复杂的样式和布局。例如&#xff0c;你可以使用<div>标签来创建一个容器&#…

postgresql 分类排名

postgresql 分类排名 排名窗口函数示例CUME_DIST 和 NTILE 排名窗口函数 排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括&#xff1a; • ROW_NUMBER&#xff0c;为分区中的每行数据分配一个序列号&#xff0c;序列号从 1 开始分配。 • RANK&#xff0c;计算每…

私密数据采集:隧道爬虫IP技术的保密性能力探究

作为一名专业的爬虫程序员&#xff0c;今天要和大家分享一个关键的技术&#xff0c;它能够为私密数据采集提供保密性能力——隧道爬虫IP技术。如果你在进行敏感数据采集任务时需要保护数据的私密性&#xff0c;那么这项技术将是你的守护神。 在进行私密数据采集任务时&#xff…

前端性能优化——包体积压缩插件,打包速度提升插件,提升浏览器响应的速率模式

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…