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

目录

一,认识 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% ,退出程序;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Notepad-- ubuntu下载安装

Notepad-- ubuntu下载安装 下载 Gitee链接&#xff1a; https://gitee.com/cxasm/notepad– 安装 sudo apt install *.deb运行 /opt/apps/com.hmja.notepad/files/Notepad--出错 需要安装qt5 sudo apt-get install qt5-default

C#,简单修改Visual Studio 2022设置以支持C#最新版本的编译器,尊享编程之趣

1 PLS README & CHAPTER 5 用一个超简单的例子说明各版本 C# 的差异。 使用新版本&#xff08;比如C#.11&#xff09;&#xff0c;当然有一定的好处。我们在写程序的时候一般这样&#xff1a; Visual Studio 2022 默认只能这样写&#xff1a; string imageFile Path.C…

如何解决跨国访问Microsoft 365网络卡顿问题?

作为主流的协调办公工具&#xff0c;Microsoft 365(旧称Office 365)是众多企业每天必须访问的应用&#xff0c;但由于多种原因&#xff0c;许多企业在跨区域访问Microsoft 365服务器时常面临卡顿、掉线等问题&#xff0c;对工作效率产生严重影响。 对此&#xff0c;连官方也专门…

视频监控平台EasyCVR+智能分析网关+物联网,联合打造智能环卫监控系统

一、背景介绍 城市作为人们生活的载体&#xff0c;有着有无数楼宇和四通八达的街道&#xff0c;这些建筑的整洁与卫生的背后&#xff0c;是无数环卫工作人员的努力。环卫工人通过清理垃圾、打扫街道、清洗公共设施等工作&#xff0c;保持城市的整洁和卫生&#xff0c;防止垃圾…

java学习part08权限

1.权限表格 外部类都是公有和缺省&#xff0c;因为其他两种对于外部类没有意义 一些内部成分都各种权限都可以 2.如何体现java封装性 答&#xff0c;通过权限控制&#xff0c;保证哪些可以给人看到&#xff0c;哪些不能

MySQL--慢查询(一)

1. 查看慢查询日志是否开启 show variables like slow_query%; show variables like slow_query_log; 参数说明&#xff1a; 1、slow_query_log&#xff1a;这个参数设置为ON&#xff0c;可以捕获执行时间超过一定数值的SQL语句。 2、long_query_time&#xff1a;当SQL语句执行…

【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

软件系统测试有哪些测试流程?系统测试报告编写注意事项

在软件开发的过程中&#xff0c;系统测试是至关重要的一环&#xff0c;它的目的是验证和评估软件产品是否符合预期的质量标准&#xff0c;以确保系统的稳定性、可靠性和安全性。 一、软件系统测试的测试流程 1、需求分析与测试计划制定&#xff1a;根据需求分析确定测试目标、…

Linux:设置Ubuntu的root用户密码

执行以下命令&#xff1a; 给root用户设置密码 sudo passwd 输入两次密码 切换root su root 退出root用户 exit

需求调研计划及用户需求调研单

1.目的 2.概述 3.需求调研计划 3.1调研目的 3.2调研范围 3.2.1.调研的职能范围 3.2.2.调研的业务范围 3.2.3.调研的地点范围 3.3调研方式 3.4调研阶段 3.5具体时间安排 软件开发全文档获取&#xff1a;点我获取 1、需求调研计划 2、用户需求调研单 项目名称 客…

boardmix AI思维导图,一键自动生成思维导图!

在日常学习和工作中&#xff0c;我们常常需要记忆和整理大量的知识点和思维结构。 此时&#xff0c;思维导图的存在就大大方便了我们的工作。与传统的文本笔记不同&#xff0c;思维导图可以结合文字、图像、颜色等多种元素&#xff0c;帮助我们更好地整理和分析知识的关系&…

腾讯又出王炸产品!使用混元大模型进行数据报表测试

最近腾讯出了自己的大模型&#xff0c;命名混元。 现在已经开始内测&#xff0c;感谢腾讯小伙伴卢晓明同学帮我们提前申请到了内测机会&#xff0c;接下来我们用腾讯混元大模型与实际工作结合&#xff0c;开始我的报表测试之旅。 腾讯混元大模型官方入口:https://hunyuan.ten…

CVE-2023-6099:优卡特脸爱云一脸通智慧管理平台SystemMng.ashx接口未授权漏洞复现

文章目录 优卡特脸爱云一脸通智慧管理平台未授权SystemMng.ashx接口漏洞复现&#xff08;CVE-2023-6099&#xff09; [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 优卡特脸爱云一脸通智慧管理平台未授权…

conda环境module ‘clip‘ has no attribute ‘load‘解决

1 问题描述 运行基于clip的zero-shot预测代码&#xff0c;报错如下&#xff1a; Traceback (most recent call last):File "D:\code\ptcontainer\clip\clipembeding.py", line 38, in <module>clip_embeding ClipEmbeding()File "D:\code\ptcontainer\c…

地埋式积水监测仪厂家批发,实时监测路面积水

地埋式积水监测仪是针对城市内涝推出的积水信息监测采集设备&#xff0c;采用超声波传感技术和超声波抗干扰功能&#xff0c;对路面的积水进行实时精准的监测。该设备能够在零下-5℃至高温70℃的严寒酷暑环境下可靠运行。它对城市道路积水进行实时监测并上报到监测系统之中&…

shopee数据分析软件丨探索Shopee数据分析软件——知虾

随着电子商务的快速发展&#xff0c;越来越多的商家和企业开始关注数据分析的重要性。在这个竞争激烈的市场中&#xff0c;了解消费者行为、市场趋势和竞争对手的策略是取得成功的关键。而Shopee数据分析软件——知虾&#xff0c;成为了许多商家和企业的首选工具。本文将深入探…

Win11和NewBing浏览器100%开启Copilot的方法

严格按以下步骤来&#xff0c;100%开启免费的AI&#xff1a; 1.系统升级到Win11最新版&#xff08;不要用家庭版&#xff0c;推荐专业版&#xff09; 升级完成之后的系统信息&#xff08;时间截至2023.11.22&#xff09; 版本号&#xff1a;23H2 操作系统版本&#xff1a;226…

代码随想录算法训练营第四十四天【动态规划part06】 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 题目链接&#xff1a; 题目页…

linux下磁盘分区、挂载实操

文章目录 一、磁盘分区1.查看磁盘分区情况2.使用fdisk进行分区&#xff08;2T以下&#xff09;3.删除分区4.使用parted对磁盘进行分区&#xff08;大于2T&#xff09; 二、磁盘格式化1.格式化文件系统2.关闭文件系统自检3.禁止检查磁盘文件系统&#xff0c;开机修复错误 三、磁…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角&#xff0c;进入设置 找到git的配置(建议直接搜索)&#xff0c;把use Editor As commit input的勾选去掉即可解决。