【Linux】make/Makefile 进度条小程序

news2024/10/5 21:20:36

目录

一,认识 make/makefile

二,实例代码

1,依赖关系

2,原理

3,项目清理

4,测试讲解

三,Linux第一个小程序-进度条

game.h

game.c

test.c

程序详解


 

一,认识 make/makefile

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。

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

二,实例代码

一般我们形成可执行程序都是这样的:

今天我们用make/makefile 来实施;

创建文件的名称一定要是 makefile 第一个字母大小写都可以;

像这样直接输入指令 make 可执行文件就会自动形成,非常的方便;

1,依赖关系

上面的文件 mybin,它依赖 game.o

game.o , 它依赖 game.s

game.s , 它依赖 game.i

game.i , 它依赖 game.c

2,原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么

1,make 会在当前目录下找名字叫 “Makefile” 或 “makefile” 的文件。

2,如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mybin”这个文件, 并把这个文件作为最终的目标文件。

3,如果mybin文件不存在,或是mybin所依赖的后面的game.o文件的文件修改时间要比mybin这  个文件新(可以用 touch 测试),那么他就会执行后面所定义的命令来生成mybin这个文件。

4,如果如果hello所依赖的game.o文件不存在,那么make会在当前文件中找目标为game.o文件的依赖性,如果找到则再根据那一个规则生成game.o文件。(这有点像一个堆栈的过程)所依赖的game.o文件不存在,那么make会在当前文件中找目标为game.o文件的依赖性,如果找到则再根据那一个规则生成game.o文件。(这有点像一个堆栈的过程)

5,当然,你的C文件和H文件是存在的啦,于是make会生成game.o 文件,然后再用 game.o 文件声明 make的终极任务,也就是执行文件mybin了。

6,这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

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

8,make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

3,项目清理

工程是需要被清理的

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

可以将我们的 mybin 目标文件声明成伪目标,测试一下。

4,测试讲解

以上都是面向于基层的原理,字有点多适合深度研究,现在我们通俗一点;

mybin:game.c 是依赖关系,mybin 是game.c 形成的可执行文件,但是具体要怎么实现呢,这就要 依赖方法了,gcc game.c -o mybin ,就是依赖方法;

而且 gcc game.c -o mybin 也可以写成 gcc -o $@  $^ ;

$@ 表示 mybin ,$^ 表示 game.c

也是一样的效果,而且更加方便,建议使用后者;

.PHONY 是讲文件修饰成 伪文件,伪文件的特性是总是被执行;

最好放在下面给 clean ,这样程序就是总是被执行清理了;

当我们总是执行 make ,后面的就失效了,因为 mybin 的修改时间比 game.c 的修改时间慢;

上面红线画的就是 修改时间,mybin 比 game.c 慢所以 make 不会被执行;

我们修改一下 game.c 文件看看;

刚修改完,game.c 的时间比 mybin 慢;

所以可以运行 make ,再次打开的时候 mybin 文件的修改时间就比 game.c 长了,make 也就执行不了了;

我们也可以用 touch 来刷新文件的修改时间;

如果将我们的 mybin 目标文件声明成伪目标,测试一下。

这样make 每次都会被执行了,但是不推荐这样使用,因为这本身就是对的,没有修改就不要执行嘛,没有毛病,现在我们的文件小每次执行都没有关系,如果我们文件非常大的时候,每次都执行的话就非常消耗时间了;

clean 是用来清理文件的,用的话是make clean;

直接一键清理文件;

哦对了,还有一个就是我们使用的 make,他为什么就执行 mybin,而不执行 clean 呢?

指令make 是从上往下执行的;

将他们换个顺序;

那我们执行 make 的时候就是执行 clean 了,执行 make mybin 的时候就是形成可执行文件 mybin 了,这个是从上往下的,顺序不影响;

三,Linux第一个小程序-进度条

开始整硬活了兄弟们;

先把刚开始需要的文件准备好;

game.h

#include<stdio.h>
#include<time.h>
#include<unistd.h>

void game(double rate);
void download();

game.c

#include"game.h"
#define MAX 1024*1024*1024

char* buff = "|/-\\";
int i = 0;
char arr[102] = { 0 };
void game(double rate)
{
	if (rate <= 1.0)
	{
		arr[0] = '=';
	}
	printf("[%-100s][%.1lf%%][%c]\r", arr, rate, buff[i % 4]);
	fflush(stdout);
	arr[(int)rate] = '=';
	if (rate< 99.0)
	{
		arr[(int)rate+1] = '>';
	}
	i++;
}

void download()
{
	srand(time(NULL)^1023);
	int max = MAX;
	int cnt = 0;
	double rate = 0;
	while (rate<100.0)
	{
		cnt+= rand() % (1024*1024);
		rate = ((cnt*1.0)/max)* 100;
		if (rate > 100)
		{
			rate = 100;
		}
		game(rate);
		usleep(50000);
	}
}

test.c

#include"game.h"

int main()
{
	download();
	return 0;
}

程序详解

这个程序是做了一个内存进度条,让 MAX 为需要下载的内存大小,然后 cnt 为已经下载的部分,rate 为已经下载的百分比,然后传给 game 函数进行进度条的运行,game 函数,根据 rete 的大小进行百分比输出,等于号也是,还有翻转的数组来判断程序有没有卡顿,之后再等于号后面加上 > 进行输出点缀,直到 100% ,退出程序;

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

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

相关文章

管易云与金蝶云星空对接集成其他出库查询连通其他出库新增(其他出库单)

管易云与金蝶云星空对接集成其他出库查询连通其他出库新增(其他出库单) 数据源系统:管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2…

【Vue】浏览器安装vue插件

首先看一下安装之后的效果&#xff0c;再考虑一下要不要安装 安装完之后&#xff0c;打开浏览器控制台&#xff08;ctrl shift j) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</t…

无人智能柜:经营成本低,运维智能化

在现代商业领域中&#xff0c;无人智能柜正逐渐崭露头角&#xff0c;成为一种具有前景的商业模式。其独特之处在于经营成本的低廉性和运维过程的智能化。相较于传统的便利店等实体店铺&#xff0c;无人智能柜在运营过程中不仅能够降低成本&#xff0c;还能够实现高效的运维管理…

内网渗透之Linux权限提升大法

文章目录 内网渗透|Linux权限提升大法0x01 前言0x02 工具介绍1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提权手法1.环境变量提权2.利用suid提权3.定时任务提权3.1定时任务文件覆盖提权3.2定时任务tar命令通配符注入提权 4.sudo提…

5分钟搞定!学会使用pytest测试框架!

本文将会把关于 Pytest 的内容分上下两篇&#xff0c;上篇主要涉及关于 pytest 概念以及功能组件知识的介绍&#xff0c;下篇主要以一个 Web 项目来将 Pytest 运用实践中。 为什么要做单元测试 相信很多 Python 使用者都会有这么一个经历&#xff0c;为了测试某个模块或者某个…

Opencv图像处理(全)

文章目录 博主精品专栏导航备注&#xff1a;以下源码均可运行&#xff0c;不同项目涉及的函数均有详细分析说明。11、图像项目实战&#xff08;一&#xff09;银行卡号识别 —— sort_contours()、resize()&#xff08;二&#xff09;文档扫描OCR识别 —— cv2.getPerspectiveT…

「周转箱」降低物料损耗的关键

仓储管理是企业物流系统中的重要组成部分&#xff0c;不仅涉及物品的存储、分拣、包装和配送&#xff0c;其服务质量和效率还将直接关系到企业的生产和经营效益。 在现代制造业中&#xff0c;降低物料损耗是企业追求高效生产和优化成本的关键目标之一。精益生产理念的实施为企…

火爆火爆!影响超250万读者,Python入门圣经全新升级!

人生苦短&#xff0c;快学Python&#xff01; 什么&#xff1f;你没用过&#xff0c;也没开始学习&#xff0c;甚至没有认真了解过这门语言&#xff1f;那你一定这一秒就开始发力——下面让我们先简单看看 Python 有多火。权威编程语言排行榜 TIOBE&#xff0c;2022 和 2023 都…

讲概念谈愿景AI Agent名不副实?看实在智能RPA Agent智能体如何落地!

OpenAI在首届开发者大会上推出了GPTs和Assitant API&#xff0c;不仅改写了AI Agent的构建范式&#xff0c;也把AI智能体的应用推向一个新高潮。GPTs和GPT商店&#xff0c;使得用户无需编码通过自然语言就能创建并拥有多个专属私人助理&#xff0c;且可以如在苹果应用商店一样在…

AI——有什么人类工作是人工智能代替不了的?

虽然人工智能科技的发展在许多方面对人类有着极大的帮助&#xff0c;有些工作能被自动化取代&#xff0c;但仍然有许多工作是人工智能无法代替的&#xff1a; 1. 创作性工作&#xff1a;例如艺术家、作家、音乐家&#xff0c;虽然AI可以模仿创作&#xff0c;但创新和独特个体的…

Jetson orin(Ubuntu20.04)不接显示器无法输出VNC图像解决办法以及vnc安装记录

sudo apt install vino 好像Jetpack 5.0中已经自带了。。 配置VNC server: gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 编辑org.gnome,增加一个“enabled key”的参数&#xff1a; cd /usr/share/glib-2…

HarmonyOS 设备管理开发:USB 服务开发指导

基本概念 USB 服务是应用访问底层的一种设备抽象概念。开发者根据提供的 USB API&#xff0c;可以获取设备列表、控制设备访问权限、以及与连接的设备进行数据传输、控制命令传输等。 运作机制 USB 服务系统包含 USB API、USB Service、USB HAL。 图 1 USB 服务运作机制 ●…

Jmeter接口测试——使用教程(上)

前言 jmeter是一款小巧&#xff0c;轻便、开源的性能测试工具&#xff0c;它也可以很方便的进行接口测试。 下面我就带大家学习下jmeter接口测试。 一、Jmeter简介 Jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使…

MobaXterm连接节点一段时间后超时Session stopped

1、MobaXterm &#xff08;1&#xff09;设置ssh 超时时间 &#xff08;2&#xff09;设置保持连接 如果服务器端设置了超时时间&#xff0c;会以服务器为准&#xff0c;具体设置&#xff1a; 2、服务端 cat /etc/ssh/sshd_config | grep "ClientAlive" 可以把设置…

VOC数据集转换为COCO数据集

VOC数据集格式 get_list.py import os import random import shutil# 设置随机种子 random.seed(1000)# 判断Annotations和JpegImages是否对应 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

Ubuntu开机显示recovering journal,进入emergency mode

在一次正常的shutdown -r now之后&#xff0c;服务器启动不起来了&#xff0c;登录界面显示recovering journal&#xff0c;主要报错信息如下所示&#xff1a; /dev/sda2:recovering journal /dev/sda2:Clearn... You are in emergency mode. After logging in, type journalc…

小程序:用户查找英语单词的意思 ← Python字典

【程序分析】 ● 字典中的条目是没有顺序的。 ● 可以对字典使用如下方法&#xff1a; keys()、values()、 items()、 clear()、 get(key)、 pop(key) 和popitem()【程序代码】 dictionary{"dog":"狗","apple":"苹果","banana&q…

基于51单片机倾角MPU6050老人跌倒远程GSM短信报警器+源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、MPU6050角度值送到液晶1602显示。 3、红外传感器检测心率。 4、跌倒远程GSM报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void LCD_Init() //初始化液晶时间显示 { write_com…

Linux | 创建 | 删除 | 查看 | 基本命名详解

Linux | 创建 | 删除 | 查看 | 基本命名详解 文章目录 Linux | 创建 | 删除 | 查看 | 基本命名详解前言一、安装Linux1.1 方法一&#xff1a;云服务器方式1.2 方法二&#xff1a;虚拟机方式 二、ls2.2 ll 三、which3.1 ls -ld 四、pwd五、cd5.1 cd .\.5.2 ls -al5.3 重新认识命…

万份水稻样本,挖掘罕见变异

水稻作为全球最重要的粮食作物之一&#xff0c;为全球一半以上的人口提供食物。自然变异是基因改良和现代育种的重要遗传基础&#xff0c;广泛挖掘水稻种质群体中的变异具有重要意义&#xff0c;近年来&#xff0c;科学家们更多关注大规模群体中的稀有变异。 2023年10月&#…