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.c
	gcc -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*1024

void 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;
}

运行结果如下:

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

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

相关文章

2024执业医师考试报名流程及上传照片要求详解

2024年执业医师和助理医师考试的报名工作将于1月22日正式启动&#xff0c;报名截止日期为2月4日。建议考生尽早报名&#xff0c;以避免在报名截止日期临近时出现拥挤情况。您可根据本文介绍&#xff0c;提前准备好报名所需资料、证件照电子版和相关证明材料&#xff0c;并了解报…

【我与Java的成长记】之多态,重载与重写详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、多态的概…

米贸搜|Facebook新手请查收!如何在FB上定位到B类受众?

一、确定目标受众和营销目标 在利用Facebook进行获客之前&#xff0c;B2B企业需要首先明确目标受众和营销目标。目标受众是指潜在的客户或合作伙伴&#xff0c;而营销目标可能是增加销量、提高品牌知名度、获取客户线索等。 Facebook的受众定位可以分成三大类&#xff1a;人口…

Netty通信中的粘包半包问题(五)

这期我们来分析下消息头消息体的这种方式来实现完美的解决方案&#xff0c;当然这也是最复杂的一种实现&#xff0c;因为在大多数场景中&#xff0c;性能和复杂度始终不能兼得。代码中使用了MessagePack的第三方序列化&#xff0c;因为我们要传输的实体类对象在客户端和服务端之…

从matlab的fig图像文件中提取数据

这里用的是openfig&#xff08;&#xff09;函数打开的fig文件 →→→【matlab 中 fig 数据提取】 很简洁 →→→【MATLAB提取 .fig 文件中的数据】 这个给出了包含多个曲线的情况 →→→【提取matlab fig文件里的数据和legend】 chatgpt给出的方法 打开fig文件并保存数据 我的…

Git 基本命令与操作流

记录 Git 中的基本命令和创建仓库、提交文件、删除文件等方面的操作 Git 基本命令 git status&#xff1a;查看状态 nothing to commit, working directory clean&#xff1a;所有已跟踪文件在上次提交后都未被更改过&#xff0c;或者说当前目录下没有出现任何处于未跟踪状态…

Java 类与对象(对象的分配机制、对象的创建过程、匿名对象)

面向对象 面向对象编程&#xff08;Object-Oriented Programming 简称 OOP&#xff09;是一种程序设计思想和编码架构。 Java 是完全面向对象的&#xff0c; 必须熟悉 OOP 才能够编写 Java 程序。 面向对象的程序是由对象组成的&#xff0c;每个对象包含对用户公开的特定功能…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

力扣每日一练(24-1-18)

经验一&#xff1a;不要把问题想复杂 Python&#xff1a; min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#&#xff1a; public int MaxProfit(int[] prices) {i…

GNU Radio简介及流程图搭建

文章目录 前言一、GNU Radio 是什么&#xff1f;二、GNU Radio 安装三、搭建第一个流程图1、创建 GRC 文件2、添加块3、运行流程图 前言 欢迎来到无线通信的世界&#xff0c;初步接触 GNU Radio&#xff0c;对其学习进行一个记录。 一、GNU Radio 是什么&#xff1f; GNU Rad…

【重点!!!】【背包】【回溯】518.零钱兑换II

题目 跟39.组合总数、322.零钱兑换题目很类似。 法1&#xff1a;背包DP&#xff0c;最优解法 解释如下&#xff1a; 0 1 2 3 4 5(背包容量)1 0 0 0 0 0 没有硬币的时候&#xff09; 0 1 2 3 4 5(背包容量) 1 1 1 1 1 1 1 0 1 2 3 4 5(背包容量) 1 …

深入解析 Java 方法引用:Lambda 表达式的进化之路

前言 方法引用是 Java 8 提供的一种新特性&#xff0c;它允许我们更简洁地传递现有方法作为参数。这项特性实际上是对 Lambda 表达式的一种补充&#xff0c;通过方法引用&#xff0c;我们可以直接引用现有方法&#xff0c;而无需编写完整的Lambda表达式。最近在使用方法引用的…

Spring(19) ThreadPoolTaskExecutor 线程池的使用

目录 一、线程池简介1.1 为什么使用线程池1.2 线程池为什么需要使用队列1.3 线程池为什么要使用阻塞队列而不是用非阻塞队列1.4 如何配置线程池1.5 execute() 和 submit() 方法 二、ThreadPoolTaskExecutor 线程池简介2.1 简介2.2 核心参数配置2.3 ThreadPoolTaskExecutor 内部…

TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

CSV文件中json列的处理2

如上所示&#xff0c;csv文件中包含以中括号{}包含的json字段&#xff0c;可用如下方法提取&#xff1a; import pandas as pd from datetime import date todaystr(date.today()) import jsonfilepath/Users/kangyongqing/Documents/kangyq/202401/调课功能使用统计/ file104…

顶顶通呼叫中心中间件如何实现自己呼叫自己并且放音:一步步配置(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件如何实现自己呼叫自己并且放音&#xff1a;一步步配置 一、配置acl.conf 打开ccadmin-》点击配置文件并且打开acl.conf-》配置好了点击提交XML。 注意&#xff1a;acl.conf的服务器IP必须是内网IP 添加了之后在运维调试输入reloadacl 在运维调试执…

对象存储, 开源MinIO docker-compose.yml 文件

文章目录 python SDK 文档地址&#xff1a;docker-compose.yml 文件控制台使用&#xff1a;应用服务中使用样例&#xff1a; python SDK 文档地址&#xff1a; https://min.io/docs/minio/linux/developers/python/API.html docker-compose.yml 文件 version: 3services:min…

优化微信小程序更新体验:异步更新与强制更新方案解析

在微信小程序的开发和迭代过程中&#xff0c;新版本覆盖率的问题一直备受关注。由于小程序采用异步更新机制&#xff0c;在用户首次打开或冷启动时才会检查并下载新版本&#xff0c;导致部分用户无法及时应用上最新版本。为了解决这一问题&#xff0c;微信团队经过深入研究和讨…

Prometheus 监控容器

容器监控&#xff1a;cAdvisor Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux/Windows/Mac机器上。容器镜像正成为一个新的标准化软件交付方式。 例如&#xff0c;可以通过以下…

NebulaGraph7 种查询(关键词、向量、混合检索),Graph RAG 探索知识图谱

NebulaGraph7 种查询&#xff08;关键词、向量、混合检索&#xff09;&#xff0c;Graph RAG 探索知识图谱 1.架构思路 如果你熟悉知识图谱和图数据库 NebulaGraph&#xff0c;可以直接跳到 “RAG 具体实现” 章节。如果你不熟悉 NebulaGraph&#xff0c;请继续往下读。 什么…