Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile

        我们首先需要知道的是,make是一个命令,Makefile是一个文件,Makefile中包含了依赖关系和依赖方法。

        从上面的文件以及指令中我们可以看到,我们可以在Makefile文件中写入依赖关系以及对应的依赖方法,Makefile文件保存退出后,在命令行中执行make,就可以自动帮我们执行依赖关系中的方法(如上所示,可以形成mybin可执行文件)。但需要注意的是,Makefile文件名不要写错。

        make和Makefile形成目标文件的时候,默认是执行第一条依赖方法,如果要执行第二或者第三条依赖方法,需要再make后加上依赖关系名。

二、补充:Linux中的三个时间

access:访问该文件的时间,access时间可能不是实时更新的

modify:最后一次修改该文件内容的时间

change:最后一次修改该文件属性的时间

三、 make和Makefile语法的认识

        .PHONY 目标文件:修饰目标文件,使之成为一个伪目标,其对应的依赖方法在每次调用时总是被执行,但该语法一般只推荐对清除的依赖方法使用,不推荐对一般的编译依赖方法使用。

        在Makefile中,可以用$@表示目标文件,$^表示源文件,效果和写成目标文件和源文件是一样的。

        这种替换方法其实可以引申到Makefile中一般的变量替换,这其实有点类似于C/C++中的宏替换。

四、基于make和Makefile的进度条代码的实现

//Makefile
processbar:processbar.c main.cgcc -o $@ $^
.PHONY:clean
clean:rm -f processbar
//processbar.h
#include <stdio.h>#define NUM 103
#define Body '='
#define Head '>'typedef void (*callback_t)(double);//回调函数void process_flush(double rate);

 

//processbar.c
#include "processbar.h"
#include <string.h>
#include <unistd.h>const char *lable="|/-\\";char buffer[NUM] = {0};
void process_flush(double rate)
{static int cnt = 0;int n = strlen(lable);if(rate <= 1.0){buffer[0] = Head;}printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt%n]);//buffer为进度条,rate为比率,lable为旋转光标fflush(stdout);//\r为回车,不会将缓冲区的内容自动刷新到屏幕上,需要用fflush刷新buffer[(int)rate] = Body;if((int)rate + 1 < 100){buffer[(int)(rate+1)] = Head;}if(rate >= 100.0){printf("\n");}cnt++;cnt %= n;
}

 

//main.c
#include "processbar.h"
#include <time.h>
#include <stdlib.h>
#include <unistd.h>#define FILESIZE 1024*1024*1024void download(callback_t cd) // 回调函数
{srand(time(NULL));int total = FILESIZE;while(total){usleep(10000);//下载int one = rand() % (1024*1024*10);total -= one;if(total < 0){total = 0;}//当前进度int download = FILESIZE - total;double rate = (download*1.0/(FILESIZE))*100.0;cd(rate);//调用回调函数打印}
}int main()
{download(process_flush);return 0;
}

运行结果如下:

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

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

相关文章

设计模式⑦ :简单化

文章目录 一、前言二、Facade 模式1. 介绍2. 应用3. 总结 三、Mediator 模式1. 介绍2. 应用3. 总结 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系列大部分内容…

配置redis挂载

1. 暂停和删除redis 2.创建文件夹 /usr/local/software/redis/6379/conf/ /usr/local/software/redis/6379/data/ 把redis-conf文件上传到conf文件夹中 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4.运…

Go后端开发 -- 反射reflect 结构体标签

Go后端开发 – 反射reflect && 结构体标签 文章目录 Go后端开发 -- 反射reflect && 结构体标签一、反射reflect1.编程语言中反射的概念2.interface 和反射3.变量内置的pair结构4.reflect的基本功能TypeOf和ValueOf5.从relfect.Value中获取接口interface的信息6…

C++ 设计模式之 中介者模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是中介者模式 &#xff08;第16种模式&#xff09; 中介者模式&#xff08;Medi…

数据结构->链队列(c/c++)

#include<iostream> #include<algorithm> #include<vector> using namespace std; //#define MAXSIZE 5 typedef int date_t; typedef struct listqueue {//节点结构体date_t name_id;listqueue* next; }listqueue,*list; typedef struct queue {//队列结构体…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

TQ8WS-acid,Tide Quencher 8WS-酸,可用来研究荧光物质的激发态

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher8WS acid&#xff0c;TQ8WS acid&#xff0c;Tide Quencher 8WS 酸 &#xff0c;TQ8WS 酸&#xff0c;Tide Quencher 8WS-酸&#xff0c;TQ8WS-酸 一、基本信息 产品简介&#xff1a;The fluorescence…

牛客.KY11二叉树遍历、 LeetCode104.二叉树的最大深度 ,110平衡二叉树

二叉树实操小练习~这里对二叉树的遍历要有一定的理解&#xff0c;如果还不熟悉的小伙伴可以看看我的这篇博客&#xff1a;数据结构——二叉树&#xff08;先序、中序、后序及层次四种遍历&#xff08;C语言版&#xff09;&#xff09;超详细~ (✧∇✧) Q_Q-CSDN博客 牛客.KY11二…

对比分析ChatGPT 和文心一言。

目录 ChatGPT 和文心一言哪个更好用&#xff1f; ChatGPT 文心一言 对人工智能的看法 ChatGPT 和文心一言哪个更好用&#xff1f; ChatGPT和文心一言是目前两种比较流行的大语言模型&#xff0c;他们的出现迎来了人工智能时代。那么&#xff0c;这两种语言哪种更加好用一些…

Mybatis源码总结

mybatis Mybatis是一个orm框架&#xff0c;帮助我们更好的在java中编写和管理SQL语句 主要的运行过程&#xff1a; 主配置文件&#xff0c;配置mapper文件的位置&#xff0c;以及数据源&#xff0c;缓存&#xff0c;插件等配置信息&#xff0c;项目运行起来后会解析该文件&am…

数据库Mysql学习day01课堂笔记

一、数据库概述及数据准备 1.什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么? 数据库: 英文单词DateBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义,存储数据的仓库,实际上就是一堆文件,这些文件中存储了具有特定格式的数据。 数…

Jtti:Linux内核怎么通过inline hook实现隐藏进程

在Linux内核中通过inline hook来隐藏进程是一种比较敏感和高级的操作&#xff0c;需要深入理解Linux内核的运作原理和对内核的深度了解。请注意&#xff0c;修改内核行为可能会导致系统不稳定&#xff0c;并且这种操作可能违反系统的安全策略&#xff0c;因此在进行此类操作之前…

民族服装数据研究:市场销售规模将突破百亿元

民族服饰文化内涵丰富&#xff0c;包括制作原料、纺织工艺、印染工艺、刺绣工艺、图案纹样、色彩表现、饰品工艺、文化价值等因素。我国民族服装在经历了过去30年全面工业化、经济高速增长、服装定制人口激增、大量生产、大量服装定制制消费到全国中产阶级化&#xff0c;人们对…

前端开发 5: Vue.js 框架

在前端开发中&#xff0c;Vue.js 是一个流行且灵活的 JavaScript 框架&#xff0c;用于构建用户界面。它采用了组件化的开发方式&#xff0c;使得前端开发更加模块化和可维护。在本篇博客中&#xff0c;我将为你介绍 Vue.js 的基础知识和常用技巧&#xff0c;帮助你更好地掌握前…

文档翻译网站有哪些?这些工具高效翻译

文档翻译网站有哪些&#xff1f;随着全球化的加速&#xff0c;跨语言沟通变得越来越重要。然而&#xff0c;语言差异常常成为我们与世界各地人们交流的障碍。为了解决这个问题&#xff0c;文档翻译软件应运而生。今天&#xff0c;我们就来介绍一些受欢迎的文档翻译软件&#xf…

【Docker】安装nacos以及实现负载均衡

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.nacos单个部署 1.镜像拉取 …

4.C++类和对象

深拷贝和浅拷贝的简单理解&#xff1a;

SpringBoot多环境配置及日志记录器

Spring Boot多环境配置 Spring Boot的针对不同的环境创建不同的配置文件&#xff0c; 语法结构&#xff1a;application-{profile}.properties profile:代表的就是一套环境 需求 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 applica…

广东省第三届职业技能大赛“网络安全项目”B模块--数字取证解析

广东省第三届职业技能大赛“网络安全项目”B模块任务书 PS: 关注鱼影安全第一部分 网络安全事件响应第二部分 数字取证调查任务 3: 网络数据包分析取证解析:第三部分 应用程序安全:需要环境可以私信博主~PS: 关注鱼影安全 模块 B 竞赛项目试题 本文件为:广东省第三届职业技…