make/makefile的使用

news/2024/5/15 3:33:59

make/makefile

文章目录

  • make/makefile
    • 初步认识makefile的工作流程
    • 依赖关系和依赖方法
    • make的使用
  • 总结


make是一个命令,是一个解释makefile中指令的命令工具,makefile是一个文件,当前目录下的文件,两者搭配使用,完成项目自动化构建

make/makefile是Linux项目自动化构建工具,将多个源文件放在makefile中,通过make命令,通过makefile文件中的依赖关系,使得文件实现自动化编译,极大的提高了软件开发的效率。

初步认识makefile的工作流程

下面通过一段代码进行编译演示makefile的工作流程

1.认识makefile文件的内容格式要求

在这里插入图片描述

2.make命令

在这里插入图片描述

上述内容,我们通过make命令,通过makefile文件中的依赖关系实现了test可执行程序。

依赖关系和依赖方法

依赖关系为我们要实现的可执行文件是需要依赖于一些文件,通过依赖方法来实现的。只需要找到合适的依赖关系和依赖方法,我们就可以自动化编译

在这里插入图片描述

//1.依赖方法实际上就是实现依赖关系的语句,来得到可执行文件
test:test.c   //当前目录下进行查找发现拥有test.c文件gcc -c test test.c  //我们通过改gcc语句来得到test
//2.如果拥有多对依赖关系的时候,对于依赖关系的文件在该makefile所在目录下进行查找,如果没有,就查看makefile中是否有能得到该文件的依赖关系,然后一步一步的向下,直到查找到的依赖关系的文件是已存在的,可以从这一依赖关系,开始运行gcc语句,来得到对应文件来作为另一依赖关系的依赖文件1 test:test.o      			//test.o 文件不存在,所以向下找2     gcc -o test test.o3 test.o:test.s				//得到.o需要.s文件,所以还是没法运行对应的gcc语句(依赖方法)4     gcc -c test.s -o test.o5 test.s:test.i				//。。。6     gcc -S test.i -o test.s                                                       7 test.i:test.c				//最后找到了.c文件的依赖关系(.c是makefile所在目录下已有的文件所以是可以执行对应的gcc语句的)8     gcc -E test.c -o test.i
//所以从 第8行开始执行.c得到.i,现在有了.i 在由test.s:test.i关系通过gcc -S test.i -o test.s  语句来得到.s以此类推,最后得到test可执行文件

make的使用

我们创建好makefile文件之后,我们可以通过make命令来运行该文件,但是我们发现的是make只能运行一次,情况如下:

在这里插入图片描述

//1.为什么会这样呢?难道不可以运行make创建新的test覆盖原来的test可执行文件对于make命令来讲,这是为了提高编译效率
//2.那么是如何判断是否需要更新该test文件的呢?我们先认识一个事情:先有源文件,再通过一定的依赖方法,得到可执行程序,所以一般来讲源文件的最近的修改时间比可执行文件要老(旧)所以当我们更改源文件之后,历史上曾经还有可执行文件,那么源文件的最近修改的时间,一定是 比可执行文件要新的。我们比较的是可执行程序的最近修改时间和源文件的最近修改时间如果.exe 新于 .c源文件 那么说明源文件是老的,即不需要重新编译如果.exe 旧于 .c源文件 那么说明.c源文件在实现.exe之后被更改了,所以需要重新编译一般 .exe!=.c

对于上述内容总结,make会根据源文件和可执行程序的新旧,来判定是否需要重新执行依赖关系进行编译!!!

查看一下文件状态命令:stat 文件名

在这里插入图片描述

文件内容之外的就是文件属性,文件=文件内容+文件属性

下面是对于三种时间的演示:

在这里插入图片描述

//对于上述的内容我们知道了
//1.Access是多次访问之后才会进行改变,是为了系统性能考虑
//2.Modify是文件内容改变之后才会改变,相应的一般大小变化之后Change也会改变,所以一般Modify==Change
//3.Change是文件属性变化才会改变(权限,大小等),一般只有Change会发生变化(Access可能变)

所以对于make判断源文件和目标文件的新旧问题,我们采用的是Change的时间(因为稳定,文件发生变化,就一定会改变时间)

对于文件新旧问题演示make
在这里插入图片描述

如果是每次都要指定指定的依赖关系:使用.PHONY : 伪目标

.PHONY:test 表示不管如何(test.c不更改也可以)都会执行该依赖关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A3ZsIRU-1689503950289)(C:\Users\红颜\AppData\Roaming\Typora\typora-user-images\image-20230716175439430.png)]

运行展示:

在这里插入图片描述

make clean的使用

make clean 使得make的操作更加简便,想要删除指定可执行程序的时候,不用去rm,直接make clean即可

操作演示:
在这里插入图片描述

在这里插入图片描述

总结

  1. make 默认实现的是makefile文件中的第一部分(模块)

  2. make + 目标 可以实现makefile中的指定目标(部分)如make clean、make test等

  3. make默认的文件是makefile/Makefile,如果使用其他文件进行操作,使用:make -f filename

  4. 对于依赖关系和依赖方法的认识,以及make不能连续执行,是因为目标文件已经是最新的,通过stat filename来查看指定文件的信息。更改源文件的信息就可以再次make进行编译

  5. stat filename(文件名),以stat+文件名的形式,我们可以查看文件的基本信息之外的三种时间

分别为:

  • Access:表示最近访问文件的时间
  • Modify:表示最近修改文件内容的时间
  • Change:表示最近修改文件属性的时间

为了linux系统的性能,Access需要多次访问该文件才能自动修改时间。

一般来讲Modify改变,文件大小改变,所以Change改变,文件属性改变,一般只有Change改变,所以我们对于是否重新编译目标文件,比较的是源文件和可执行程序的Change时间。


http://www.mrgr.cn/p/42125025

相关文章

【前端知识】React 基础巩固(四十二)——React Hooks的介绍

React 基础巩固(四十二)——React Hooks的介绍 一、为什么需要Hook? Hook 是 React 16.8 的新增特性,它可以让我们在不编写class的情况下使用state以及其他的React特性(比如生命周期)。 class组件 VS 函数式组件: class的优势…

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 (1)聚合函数: (2) group by 子句 (3)having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…

Web3将自己写在合约中的代币添加到MetaMask中管理

上文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 带着大家在智能合约中创建了一个自己的代币系统 我们可以在MetaMask中去导入 ganache环境下模拟出来的第一和第二个账号 我们这里 可以看到他们的 ETH 但看不到自己的代币符号 没关系 我们点击这下面的…

字节跳动后端面试,笔试部分

var code "7022f444-ded0-477c-9afe-26812ca8e7cb" 背景 笔者在刷B站的时候,看到了一个关于面试的实录,前半段是八股文,后半段是笔试部分,感觉笔试部分的题目还是挺有意思的,特此记录一下。 笔试部分 问…

API教程:轻松上手HTTP代理服务!

作为HTTP代理产品供应商,我们为您带来一份详细的教程,帮助您轻松上手使用API,并充分利用HTTP代理服务。无论您是开发人员、网络管理员还是普通用户,本教程将为您提供操作指南和代码模板,确保您能够顺利使用API并享受HT…

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…

高通死机分析-工具

为了方便高通稳定性领域分析9008以及死机问题,特此写此工具,方便大家分析死机问题,此工具还待完善,后续将发布,有兴趣请联系2251858097qq.com

7、单元测试--测试RestFul 接口

单元测试–测试RestFul 接口 – 测试用例类使用SpringBootTest(webEnvironment WebEnvironment.RANDOM_PORT)修饰。 – 测试用例类会接收容器依赖注入TestRestTemplate这个实例变量。 – 测试方法可通过TestRestTemplate来调用RESTful接口的方法。 测试用例应该定义在和被测…

M 芯片的 macos 系统安装虚拟机 centos7 网络配置

centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了,如果重启网卡不管用,则重启虚拟机即可 “ ifcfg-ens160 ” 这…

美容店预约小程序制作教程详解

现在,制作一个专属于美容店的预约小程序不再需要编程经验,通过乔拓云网提供的后台管理系统,你可以轻松地完成整个制作过程。下面,我将为你详细介绍如何DIY一个美容店预约小程序。 首先,登录乔拓云网的后台管理系统&…

NAS私有云存储 - 搭建Nextcloud私有云盘并公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文…

c++11 标准模板(STL)(std::basic_ifstream)(一)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istream…

ALLEGRO之File

本文主要讨论ALLEGRO软件中的File菜单。 &#xff08;1&#xff09;New&#xff1a;新建&#xff0c;用于新建Board/Package symbol等&#xff1b; &#xff08;2&#xff09;Open&#xff1a;打开&#xff0c;用于打开brd、dra等文件&#xff1b; &#xff08;3&#xff09;S…

Spring详解(学习总结)

目录 一、Spring概述 &#xff08;一&#xff09;、Spring是什么&#xff1f; &#xff08;二&#xff09;、Spring框架发展历程 &#xff08;三&#xff09;、Spring框架的优势 &#xff08;四&#xff09;、Spring的体系结构 二、程序耦合与解耦合 &#xff08;一&…

菜单 vue3 h函数创建组件

目录 index/.vue <template><div class"menu_table"><divclass"table_row"v-for"(item, index) in menuList"click"item.disabled ! true && itemClick(item)"><!-- :style"{border-top:item.line…

Redis常用命令

1.String类型 MSET &#xff1a;批量添加多个String类型键值对 MGET&#xff1a;批量获取多个String类型键值对 127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> MGET k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> …

nginx mirror代码分析

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…

C语言中的函数(超详细)

C语言中的函数&#xff08;超详细&#xff09; 一、函数概述二、C语言中函数的分类1.库函数2.自定义函数三、函数的参数1.实际参数&#xff08;实参&#xff09;2.形式参数&#xff08;形参&#xff09;四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调…

二叉树(C语言)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

Android应用开发(23)获取亮灭屏状态

Android应用开发学习笔记——目录索引 在android 应用程序获取亮灭屏状态的常用方法有&#xff1a; 使用PowerManager提供的API函数注册Broadcast监听 一、使用PowerManager提供的API函数 frameworks/base/core/java/android/os/PowerManager.java import android.os.Buil…