【lesson6】Linux make和makefile

news2024/11/18 4:25:24

文章目录

  • make和Makefile的介绍
  • make和Makefile的使用
  • make和Makefile的项目测试

make和Makefile的介绍

make是一个命令
Makefile是一个文件
make和Makefile是Linux自动化构建项目的工具。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
Makefile里面维护两种关系:
1.依赖关系
2.依赖方法

举例子解释一下:
假如你是清华大学的学生,新的学期开学了,学校提醒交学费,如果不交学费就会被退学,于是你到教务处交学费,到教务处首先表明我是清华大学的,然后交上学费。
其中你是
清华大学的学生就是依赖关系,
交学费就是依赖方法。

make和Makefile的使用

首先要在路径下创建一个Makefile文件
在这里插入图片描述
然后在Makefile中编辑依赖关系和依赖方法
在这里插入图片描述
测试:
在这里插入图片描述
我们可以很清楚的看到执行make自动生成可执行程序,执行make clean自动清除可执行程序
这时候不知道大家有没有一个问题,就是生成可执行程序我们要make,可以删除可执行要make clean为什么不能直接clean删除呢?
因为make只会自顶向下执行第一个依赖方法什么意思呢?
演示:
在这里插入图片描述
我们如果改了make和clean的顺序,那么接下来make会发生什么呢?
在这里插入图片描述
我们会发现make变成删除文件了,要创建文件的make test了。
接下来还有一个问题:
在这里插入图片描述
大家知不知道.PHONY是什么?
在这里插入图片描述
什么是伪目标呢?
伪目标:总是被执行的叫做伪目标
那么总是被执行是什么意思呢?
例子:

在这里插入图片描述
相信大家都已经看出区别了,make被执行过一次就不能被执行了,除非test.c做了修改。而make clean不管发生什么总之一直执行。
所以总是被执行的意思是:总会根据依赖关系,执行依赖方法。

这时候又引出一个问题,我们知道make是根据test.c有没有被修改来判断需要需要重新make,那么Makefile是如何知道可执行程序是否需要重新生成呢?

答案:根据文件最近修改时间来确定的。
我们之前学过stat,我们知道文件有三个时间:

在这里插入图片描述
这三个时间分别代表什么意思呢?
Access:文件最近被访问的时间
Modify:文件内容被修改时间
Change:文件属性被修改的时间

演示:
在这里插入图片描述
我们可以看到test.c的最后修改时间,比test早很多,所以test就已经是最新的可执行程序,那么如果我们修改一下test.c会如何呢?
在这里插入图片描述
我们会发现make确实又可以执行了

make和Makefile的项目测试

我们平常用C语言写项目的时候,一般都有:
test.h:函数声明
test.c:函数实现
main.c:项目测试
那么我们如何用make和Makefile生成这个些文件的可执行程序呢?
在这里插入图片描述
在这里插入图片描述
我们如何用一个make让这个代码运行起来呢?
那么就要改进Makefile
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们可以看到make之后确实按预期生成了可执行程序和.o文件,而make clean之后也确实所有.o文件和可执行程序都被删除。

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

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

相关文章

6门新兴语言,小众亦强大

编码语言在塑造我们创建软件的方式方面起着至关重要的作用。多年来,我们观察到Python,Java和C等成熟语言的流行。然而,如今一波新的编码语言浪潮已经出现,提出了创造性的解决方案,并推动了软件工程领域所能完成的极限。…

12页线性代数图解教程,github星标9.1k,适合小白

线性代数“困难户”注意,今天我给大家分享一个超适合小白的线性代数学习笔记,只有12页纸,一半都是图解,不用担心看不懂。 这份笔记名为《线性代数的艺术》,是日本学者Kenji Hiranabe基于Gilbert Strang教授的《每个人…

Vue 组件传参 prop/emit

学习了组件用法,就像一种嵌套引用关系,在这个关系中,经常会涉及相互传数据的需求,即父组件传子组件,子组件传父组件。 父、子组件的关系可以总结为: prop 向下传递(父传子)&#xf…

Docker复习

目录 1. Docker的理解1.1 Docker三要素 2 安装Docker2.1 安装命令2.2 配置阿里云加速器 3 Docker命令3.1 启动类命令3.2 镜像类命令 4 实战4.1 启动容器,自动创建实例4.2 查看Docker内启动的容器4.3 退出容器4.4 其他4.5 导入导出文件4.6 commit 5 Dockerfile5.1 理…

MySQL数据库局域网连接

目录 前言 客户端 开启访问权限 防火墙设置 windows Linux 测试连接 前言 MySQL数据库远程连接(局域网)是指在局域网内的不同计算机或设备之间,通过网络连接到MySQL数据库服务器的过程。在这种情况下,MySQL数据库服务器位…

编译原理

一,基本概念 二,词法分析

使用python部署chineseocr_lite

使用python部署chineseocr_lite 简介安装报错解决python调用结果 简介 项目地址:https://github.com/DayBreak-u/chineseocr_lite chineseocr_lite 是一个开源项目,用来实现中文的文字识别,支持竖排文字识别、繁体识别,总模型只…

Mysql加锁过程

1、背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问…

最优除法(力扣)数学 JAVA

给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。例如, [2,3,4] -> 2 / 3 / 4 。 例如,nums [2,3,4],我们将求表达式的值 “2/3/4”。 但是,你可以在任意位置添加任意数目的括号,来改变算数的…

LT2911R -D 是一款MIPI/TTL和LVDS互转的一款高性能旋转芯片

LT2911R -D 1.概述:LT2911R-D是一种在MIPI/TTL/LVDS之间相互转换的高性能转换器,除了LVDS转MIPI除外。LT2911R-D反序列化输入的MIPI/LVDS/TTL视频数据,解码数据包、旋转视频、改变帧率,并将格式化的视频数据流转换为AP和移动显示…

给你推荐几个好用的Android Studio插件

给你推荐几个好用的Android Studio插件 1. CodeGlance(代码全景) 类似于Sublime或Xcode,此插件在您的编辑器中嵌入了一个代码迷你地图。滚动条也会变得稍大一些。CodeGlance预览了文件的代码模式,让您快速导航到所需的部分。 …

QUiLoader:彻底分离你的Ui设计工作

QUiLoader:彻底分离你的Ui设计工作 1. QUiLoader:彻底分离你的Ui设计工作widget.hwidget.cpp 2. Qt、C动态UI3. QT 使用QLibrary加载动态库 1. QUiLoader:彻底分离你的Ui设计工作 原文链接:https://blog.csdn.net/adonis1620/article/details/5794797 Trolltech提…

加入气压计模组,星斗3号将实现快速三维定位

随着信息技术的飞速发展,人们的生活正在发生巨大改变,人们对基于位置服务的需求越来越迫切,尤其是室内位置服务。 室外定位系统中BDS系统、GPS系统等受室内复杂环境条件限制精度大幅下降甚至失效,难以在室内定位中发挥作用,而室内二维定位技术缺乏高程信息,也难以满足人们对室…

独立式电火花脉冲电源的放电回路

根据一篇专利来的 电火花加工电源的放电回路 1 电火花电源的放电回路 电火花加工电源的放电回路,包括工作电源、充电电源以及由电极和工件连接端子组成的放电支路,还包括分别与所述放电支路并联的消电离支路、负波吸收支路和增爆电容支路,所述放电支路的电极端连…

【多模态】19、RegionCLIP | 基于 Region 来实现视觉语言模型预训练

文章目录 一、背景二、方法2.1 Region-based Language-Image Pretraining2.2 目标检测的迁移学习 三、效果3.1 数据集3.2 实现细节3.3 结果 论文: RegionCLIP: Region-based Language-Image Pretraining 代码:https://github.com/microsoft/RegionCLIP …

要理解用户空间与内核空间之间的关系

需要对内核有深入的认识。从两个不同的角度来理解内核:一是从静态角度,内核可以被看作一个类库,对外提供API接口;二是从动态角度,内核启动多个内核线程提供系统服务,这些线程在ps命令下可以被看到。 当用户…

二级制部署kubernetes(1.20)

😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小…

HarmonyOS/OpenHarmony元服务开发-卡片使用动效能力

ArkTS卡片开放了使用动画效果的能力,支持显式动画、属性动画、组件内转场能力。需要注意的是,ArkTS卡片使用动画效果时具有以下限制: 以下示例代码实现了按钮旋转的动画效果: Entry Component struct AttrAnimationExample { St…

系列二、RocketMQ简介

一、概述 RocketMQ是一款阿里巴巴开源的消息中间件。2016年11月28日,阿里巴巴向Apache软件基金会捐赠RabbitMQ,成为Apache孵化项目。2017年9月25日,Apache宣布RocketMQ孵化成为Apache顶级项目(TLP),成为国内…

01)docker学习 centos7离线安装docker

docker学习 centos7离线安装docker 在实操前可以先看下docker教程,https://www.runoob.com/docker/docker-tutorial.html , 不过教程上都是在线安装方式,很方便,离线安装肯定比如在线麻烦点。 一、什么是Docker 在学习docker时,在网上看到一篇博文讲得很好,自己总结一下…