make/makefile的使用

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.mzph.cn/news/883.shtml

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

相关文章

Python采集课堂视频教程, m3u8视频解密

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用: requests >>> pip install requests pycryptodome --> pip install pycryptodome re 第三方模块安装方法: win R 输…

7.14~7.15学习总结

Java的前置知识学习时间截至了,慌的一批~~。 看看自己学的,再看看要求学的,简直: 现在继续:IO流里面的Commons_IO的用法: public class Main {public static void main(String[]args) throws IOException…

【C++】多线程编程三(std::mutexstd::mutex、std::lock_guard、std::unique_lock详解)

目录 一、线程间共享数据 1.数据共享和条件竞争 2.避免恶性条件竞争 二、用互斥量来保护共享数据 1. 互斥量机制 2.mutex头文件介绍 三、C中使用互斥量mutex 1. 互斥量mutex使用 2.mutex类成员函数 ① 构造函数 ② lock() ③ unlock() ④ try_lock() 四、使用std::…

如何与ChatGPT愉快地聊天

原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

mac安装Golang开发环境及快速入门

目录 一、Mac brew 安装go环境 1.1 安装步骤 1.2 设置GOPATH 及环境变量 1.3 编写第一个go程序 二、快速入门 2.1 快速入门需求 2.2 go学习(自用) 2.2.1 go基础程序 2.2.2 变量声明 2.2.3 常量和枚举 2.2.4 函数与多种返回值 2.2.5 init函数…

18.Lucas-Kanade光流及OpenCV中的calcOpticalFlowPyrLK

文章目录 光流法介绍OpenCV中calcOpticalFlowPyrLK函数补充reference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 光流法介绍 光流描述了像素在图像中的运动,就像彗星☄划过天空中流动图像。同一个像素,随着时…

手写对象浅比较(React中pureComponent和Component区别)

PureComponent和Component的区别 PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数 //PureComponent类似自动加了这段shouldComponentUpdate(nextProps,nextState){let { props, state } this;// props/state:修改之前的属性状态// nextProps/nextState…

047、TiDB特性_TopSQL

TopSQL 之前 之前没有办法找单个TiKV Server的语句。只能查找整个集群的慢语句。 TopSQL之后 指定TiDB及TiKV实例正在执行的SQL语句CPU开销最多的Top 5 SQL每秒请求数、平均延迟等信息 TopSQL 使用 选择需要观察负载的具体TiDB Server或TiKV实例 观察Top 5 类SQL 查看某…

用IDEA写第一个Spring程序 HelloWorld

用IDEA写第一个Spring程序 HelloWorld 环境 Orcal JDK:1.8.0_341 maven:3.9.3 Spring:5.3.10 IDEA:2023.1.2 1. 安装JDK和IDEA 2. 安装maven并配置环境变量、换源 3. IDEA中maven属性配置,主要是版本和settings文件及…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试,可提供点参考!下面就包括测试代…

centos7 docker 安装sql server 2019

contos7安装sql server docker最低1.8或更高 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 装docker依赖包 #安装所需资源包 sudo yum install -…

uniapp实现微信小程序自带的分享功能

定义 share.js 文件 export default {data() {return {// 默认的全局分享内容share: {title: 标题,path: /pages/index/index, // 全局分享的路径imageUrl: , // 全局分享的图片(可本地可网络)}}},// 定义全局分享// 1.发送给朋友onShareAppMessage(res) {return {title: this…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码(C语言) 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序(by Donald Shell) 引例 给以下序列进行排序: 先以5的间隔进行插入排序&#xff1a…

设计模式之桥接模式

写在前面 本文看下桥接设计模式。 1:介绍 1.1:什么时候桥接设计模式 当一个业务场景由多个变化维度组成,并且这多个变化的维度到底有多少种情况是不确定,比如现在我们要为瑞幸咖啡写一个系统,很自然的,…

2023.7.16 第五十九次周报

目录 前言 文献阅读:跨多个时空尺度进行预测的时空 LSTM 模型 背景 本文思路 本文解决的问题 方法论 SPATIAL 自动机器学习模型 数据处理 模型性能 代码 用Python编写的LSTM多变量预测模型 总结 前言 This week, I studied an article that uses LSTM to solve p…

Element分页组件自定义样式

样式效果 页面代码 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"page.page":page-sizes"[10, 20, 30, 40]":page-size"page.size"layout"total, sizes, prev, …

如何用https协议支持小程序

步骤一&#xff1a;下载SSL证书 登录数字证书管理服务控制台。在左侧导航栏&#xff0c;单击SSL 证书。在SSL证书页面&#xff0c;定位到目标证书&#xff0c;在操作列&#xff0c;单击下载。 在服务器类型为Nginx的操作列&#xff0c;单击下载。 解压缩已下载的SSL证书压缩…

使用 jmeter 进行审批类接口并发测试

目录 前言&#xff1a; 背景&#xff1a; 难点&#xff1a; 场景 a&#xff1a; 场景 b&#xff1a; 前言&#xff1a; 使用JMeter进行审批类接口的并发测试是一种有效的方法&#xff0c;可以模拟多个用户同时对接口进行审批操作&#xff0c;以评估系统在高负载情况下的性…

Java+Vue+Uniapp全端WMS仓库管理系统

详情图片为运行截图,功能列表: 1、数据管理:物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应商管理、仓库管理、货位管理、车间管理 2、采购管理:物料标签管理、入库单管理、入库退货管理 3、质检管理:质检单管理(包括单据号、单据类型、创建时间、检验状态…

4. CSS用户界面样式

4.1什么是界面样式 所谓的界面样式,就是更改一些用户操作样式,以便提高更好的用户体验。 ●更改用户的鼠标样式 ●表单轮廓 ●防止表单域拖拽 4.2鼠标样式cursor li {cursor: pointer; }设置或检索在对象上移动的鼠标指针采用何种系统预定义的光标形状。 4.3轮廓线outline…