Linux开发工具(4)——Makefile

news2025/7/26 7:54:35

文章目录

    • Makefile
      • makefile语法
      • makefile原理
    • Linux小程序
      • 倒计时小程序
      • 进度条程序

Makefile

Makefile是Linux下的项目自动化构建工具。
Makefile包含两部分,make是一个指令,makefile是一个文件。
在makefile这个文件里面需要写两部分内容:

  1. 依赖关系
  2. 依赖方法

makefile语法

makefile的意义就是为了构建项目(完成某件事情),举个例子:依赖关系就是完成这件事情要依靠的各种人脉关系,依赖方法就是完成这件事情要做什么。

makefile的语法,makefile写成Makefile也是没问题的。
将makefile文件放入源代码所处的目录中。
在这里插入图片描述

这个就是makefile的语法,第一行是依赖关系,mytest是目标程序,test.c是依赖文件列表,可以是多个文件
第二行必须以Tab开头,不可以用四个空格代替,第二行写的就是依赖方法,也就是完成任务所要做的动作。
在这里插入图片描述

有了makefile之后使用make指令就可以完成对源文件的编译。

在这里插入图片描述

新增一个clean功能,既然makefile可以自动化构建项目自然也可清理,这里的.PHONY修饰了clean表示clean是一个伪目标,伪目标就是可以保证目标一直被执行。clean没有依赖关系,也就是clean自己就可以完成任务不需要依赖任何人。

makefile原理

在这里插入图片描述

make只有在第一次编译的时候才会进行更新,后序就不会进行更新因为没有对源文件进行修改自然不需要再重复编译,这是gcc的特性,因为在大型的项目中,编译一个项目少则几十分钟,多则几个小时,所以重复编译没有修改的代码就会造成时间的浪费。
在这里插入图片描述

clean是可以被重复执行的。因为clean被.PHONY修饰成伪目标所以其一直是被执行的。
这里调用clean的使用的是make clean 因为在调用make的时候其实是省略了mytest,因为调用make的时候默认是从makefile的第一个依赖方法开始执行。所以在这里的make == make mytest。

在这里插入图片描述

如果将mytest也修饰成伪目标,那么他也可以每次都被执行。
在这里插入图片描述

但是不建议这样写,因为如果源文件代码没有被修改那么重复编译是没有意义的。

gcc防止重复编译的原理就是通过比较可执行程序和源文件的Modify的时间,因为是先有了源文件再有了可执行程序所以,可执行程序的Modify时间一定比源文件早,如果源文件早,那么说明源文件在生成了可执行程序后又进行了修改,所以可以进行再次编译。
在这里插入图片描述

Access时间是访问时间,因为文件被访问的次数可能会很多,所以并不是一次访问文件,文件的Access时间就被更改,而是在一段时间内进行了多次的修改才会修改Access,可以减少在文件高频访问的时候每次都修改时间的性能消耗。
Modify时间是文件内容被修改的时间
Change时间是文件属性被修改的时间,一般伴随Modify时间的改变而改变,因为文件的大小也是属性,或者是修改文件的属性而改变。

了解了为什么gcc可以禁止重复编译之后,.PHONY的原理也很明朗了,.PHONY修饰的目标可以编译是因为被.PHONY修饰了以后取消使用了gcc的时间比较策略。(每次make是不会影响test.c的时间的)

makefile默认只会生成一个可执行程序。
makefile的推导规则类似于栈,比如下面这样写makefile。
在这里插入图片描述

推导顺序是,mytest依赖于test.o但是现在没有test.o就去下面查看,发现test.o依赖于test.s然后test.s依赖于test.i继续推导test.i依赖于test.c最后test.c发现有这个文件,然后执行test.i的依赖方法生成了test.i然后向上回溯,用test.i生成了test.s 用test.s生成了test.o最后test.o生成了mytest。就是一个栈结构,先遇到的反而最后执行。
在这里插入图片描述

这张图的命令执行顺序也说明了,Makefile的推导顺序是栈结构的先进后出。

Linux小程序

倒计时小程序

\n和\r的作用和区别,\r的作用时回车,\n的作用的换行,回车的意思就是将光标退回到这一行的开始,换行就是将光标移动到下一行,所以我们平时说的语言层面的回车是指\r + \n回车加换行。
倒计时是指在一个位置显示从10到0的数字,并不是将这11个数字都打印出来,而是在一个位置显示,后面显示的数字会覆盖掉前面显示的数字。这时候就会用到\r让光标回到一行的最开始位置。使用一个sleep休眠函数,就可以了就像下面的代码

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     int cnt = 10;
  7     while(cnt >= 0)
  8     {
  9         printf("%2d\r",cnt);
 11         sleep(1);
 12         cnt--;
 13     }
 15     return 0;
 16 }

但是运行这个代码什么都没有打印出来,这是因为printf打印出来的字符都是在行缓冲区里面,而行缓冲区是很大的,所以除非写满了行缓冲区会将所有的字符一起输出,或遇到了\n换行也会清空行缓冲区。还有一个函数fflush也可以用来清空行缓冲区。
所以最终代码如下:

1 #include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     int cnt = 10;
  7     while(cnt >= 0)
  8     {
  9         printf("%2d\r",cnt);
 10         fflush(stdout);
 11         sleep(1);
 12         cnt--;
 13     }
 15     return 0;
 16 }

进度条程序

进度条程序也是利用了\r回到行最开始的位置,和输出缓冲区的一个小程序代码。
目标的样子是[##########################][100%][/],'#'代表进度条,后面的数字代表当前加载到的百分比。最后一个方框显示的是一条线在沿着顺时针转动,一般我们看到的进度条都有一个小标记来表示是不是卡死了。如果最后的线还在转说明程序没有卡死。

//test.c
//主函数所在的文件
#include "process.h"
int main()
{
    Process();
    return 0;
}
//process.h
//函数声明所在文件
#include <stdio.h>
#include <unistd.h>

void func();//测试makefile的函数
void Process();
//process.c
//函数实现所在的文件
#include "process.h"

void func()
{
    printf("hello func\n");
}

void Process()
{
    char arr[110] = {0};
    char brr[5] = {'|','/','-','\\'};
    int cnt = 0;
    while(cnt <= 100)
    {
        printf("[%-100s][%d%%][%c]\r",arr,cnt,brr[cnt%4]);
        fflush(stdout);
        usleep(100000);
        arr[cnt++] = '#';
    }
    puts("");
}

最终的效果就是这样子。在这里插入图片描述

当然如果想要更好看一些还可以更改颜色。C语言的printf是可以控制打印的颜色的
主要格式就是:printf(“\033[字符背景颜色;字体颜色m要打印的字符串\033[0m]”);
最后的0m是控制码
字背景颜色范围: 40–49 字颜色: 30–39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
控制码:
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m – \033[37m 设置前景色
\033[40m – \033[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

printf("\033[47;35m[%-100s][%d%%][%c]\r\033[0m",arr,cnt,brr[cnt%4]); 

在这里插入图片描述

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

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

相关文章

【LeetCode】891.子序列宽度之和

**> ## 题目描述 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums &#xff0c;返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大&#xff0c;请返回对 109 7 取余 后的结果。 子序列 定义为从一个数组里删除一些&#xff…

Scala009--Scala中的数据结构【映射】

目录 一&#xff0c;概述 二&#xff0c;map的声明 1&#xff0c;不可变map 三&#xff0c;HashMap的声明 1&#xff0c;可变hashmap 四&#xff0c;map常用函数 1&#xff0c;查看map中的元素个数 size 2&#xff0c;获取map集合中key对应的value值 1&#xff09;使…

react源码中的hooks

今天&#xff0c;让我们一起深入探究 React Hook 的实现方法&#xff0c;以便更好的理解它。但是&#xff0c;它的各种神奇特性的不足是&#xff0c;一旦出现问题&#xff0c;调试非常困难&#xff0c;这是由于它的背后是由复杂的堆栈追踪&#xff08;stack trace&#xff09;支…

更新后的python seaborn用于科研图绘

python seaborn 0.12 数据科学和科研绘图的人离不开R的ggplot2&#xff0c;尽管python已经有了诸如matplotlib、seaborn等强大绘图包&#xff0c;兼有basemap、cartopy等空间数据可视化能力&#xff0c;但相较于R的ggplot&#xff0c;总感觉欠缺了点东西。 前不久seaborn更新…

Ubuntu系统安装

一、制作启动盘 首先格式化U盘&#xff0c;格式选NTFS 制作启动盘&#xff0c;这里使用的是ultraISO&#xff0c;也是使用最多的方式。 打开文件&#xff0c;选中下载好的镜像iso文件。 启动 -> 写入硬盘映像 选择自己的U盘&#xff0c;写入方式选择 USB-HDD&#xff0c;隐…

进程地址空间详解

文章目录空间布局图首先有一个问题&#xff0c;我们曾经学过的程序地址空间是内存吗&#xff1f;&#xff1f;&#xff1f;为什么fork()会返回两个值先来看一下一个代码的现象在这里插入图片描述在C/C中我们看到的地址是物理地址吗&#xff1f;为什么操作系统不让我直接看到物理…

SpringBoot整合RabbitMQ

RabbitMQ安装部署详情可见&#xff1a;RabbitMQ简介及在Linux中安装部署&#xff08;yum&#xff09; 一、导入pom.xml依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</versio…

简单的抓包

验证TCP/IP协议栈结构、帧结构 准备&#xff1a; 用到的软件&#xff1a;科来网络分析系统、putty 1&#xff09;准备两台虚拟机&#xff08;我这里准备windows2003、7&#xff09;&#xff0c;并让两台虚拟机可以互相通信&#xff08;配置IP&#xff0c;让他们处于同一局域网…

基于SSM的网络教学(作业)管理系统

1、项目介绍 基于SSM的网络教学&#xff08;作业&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;教师管理、学生管理、课程管理、教学信息管理、作业管理、试卷管理、试题管理、论坛管理、系统管理、考试管理等 教师&#xff1a;课程信…

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手 步骤 一、支付宝开放平台 1、进入支付宝开放平台&#xff0c;登录&#xff0c;然后点击控制台&#xff0c;划到最下面&#xff0c;点击沙箱 2、APPID一会要用到&#xff0c;然后将接口加签方式选择为自定义密钥&a…

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型Ref1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane)\blue{\text{质膜 (plasma membrane)}}质膜 (plasma membrane)。…

RabbitMQ系列【10】死信队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录概念创建死信交换机、队列过期导致死信拒接消费长度限制概念 无法被消费的消息被称为死信&#xff0c;存放死信的队列也就是死信队列。 由于某些特定的原因导致队列中的某些消息无法被消费&am…

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…

[附源码]java毕业设计览宏公司会议管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…