【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*1024char* 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.hqwc.cn/news/209239.html

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

相关文章

论设备管理的发展趋势及对策

作者&#xff1a;韩平 设备是企业生产要素的一个重要组成部分&#xff0c;是企业进行生产活动的物质硬件基础&#xff0c;也是决定企业生产效能的重要因素之一。 设备管理又称设备工程&#xff0c;是根据企业生产经营目标&#xff0c;为了提高设备效能&#xff0c;在调查研究…

【Web】NodeJs相关例题wp

目录 ①[GKCTF 2020]ez三剑客-easynode ②[MoeCTF 2021]fake game ③[安洵杯 2020]Validator ④ [HZNUCTF 2023 final]eznode ⑤[CNSS] &#x1f3ed; EzPollution_pre ⑥[CNSS]✴️ EzPollution ①[GKCTF 2020]ez三剑客-easynode const express require(express); co…

009 OpenCV threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

使用 PowerShell 创建共享目录

在 Windows 中&#xff0c;可以使用共享目录来将文件和文件夹共享给其他用户或计算机。共享目录可以通过网络访问&#xff0c;这使得它们非常适合用于文件共享、协作和远程访问。 要使用 PowerShell 创建共享目录&#xff0c;可以使用 New-SmbShare cmdlet。New-SmbShare cmdl…

规则引擎Drools使用,0基础入门规则引擎Drools(一)基础入门

文章目录 系列文章索引一、规则引擎概述1、引出问题2、什么是规则引擎3、使用规则引擎的优势4、规则引擎应用场景 二、Drools介绍1、Drools概述2、Drools构成3、相关概念说明4、Drools执行过程5、KIE介绍 三、Drools入门案例1、业务场景说明2、开发实现 四、Drools基础语法1、规…

ios打包,证书获取

HBuilderX 打包ios界面&#xff1a; Bundle ID(AppID)&#xff1a; 又称应用ID&#xff0c;是每一个ios应用的唯一标识&#xff0c;就像一个人的身份证号码&#xff1b; 每开发一个新应用&#xff0c;首先都需要先去创建一个Bundle ID Bundle ID 格式&#xff1a; 一般为&…

vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾

效果图&#xff1a; 代码实现&#xff1a; html&#xff1a; <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…

ubuntu上编译proj-7.1.0出现tiffio.h找不到的错误

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在编译ubuntu上编译proj-7.1.0出现下面错误&#xff1a; grids.cpp:41:10: fatal error: tiffio.h: No such file or directory41 | #include "tif…

还不知道指针和引用的区别,一篇文章教会你

1、引用的概念 1.引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名 2.编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 比如:孙悟空&#xff0c;可以叫他孙悟空&#xff0c;也可以叫齐天大圣。本质他们就是一个人 2、引用的定…

逸学java【初级菜鸟篇】9.3 Stream流

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 得益于Lambda所带来的函数式编程&#xff0c;引入了一个全新的Stream流概念&#xff08;就是都基本使用lambda的形式&#xff09;。 流处理 我们首先理解什么是流处理&#xff0c;它类似于sql语句&#xff0c;可以执行非常复…

【nlp】2.8 注意力机制拓展

注意力机制拓展 1 注意力机制原理1.1 注意力机制示意图1.2 Attention计算过程1.3 Attention计算逻辑1.4 有无attention模型对比1.4.1 无attention机制的模型1.4.2 有attention机制的模型1 注意力机制原理 1.1 注意力机制示意图 Attention机制的工作原理并不复杂,我们可以用下…

Jmeter 压测实战保姆级入门教程

1、Jmeter本地安装 1.1、下载安装 软件下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的&#xff0c;修改中文&#xff0c;点击…