项目自动化构建工具——make/Makefile

news2024/9/23 7:24:28

目录

一、概念

二、使用实例

 三、原理

四、进度条程序

1、缓冲区问题

1、概念

2、\r和\n

2、代码编写


一、概念

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 

make是一条命令,是一个解释makefile中指令的命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建。


二、使用实例

首先,我们创建两个文件:Makefile和test.c。

我们先在源文件test.c中简单写一段代码。 

然后我们再编写Makefile:第二行和第六行必须以tab开头。

 

接着我们使用make命令,发现生成了可执行程序。

最后我们运行可执行程序:

我们发现程序成功执行了。以上就是make/makefile(m可以大写)的简单使用。


 三、原理

要想弄清楚原理,首先我们必须要知道两个概念:依赖关系和依赖方法。

如何编写makefile:

1、建立依赖关系,谁依赖于谁(比如上面的例子,mytest依赖于test.c,因为test.c是我们自己创建出来的,mytest是通过test.c编译出来的)。

2、新起一行,必须以tab键开头,建立依赖方法,即两者的依赖关系是通过什么方法建立起来的(比如上面的例子,mytest依赖于test.c的关系是通过tes.c编译而形成的)。

3、清理:清理文件/临时数据

使用make clean后,可执行程序就会被清理掉,需要重新make。相当于vs中的重新生成解决方案。 

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

基本原理:

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2、如果找到,它会从上到下按顺序找文件中的第一个目标文件,在上面的例子中,他会找到“mytest”这个文件,并把这个文件作为最终的目标文件。

3、如果mytest文件不存在,或是mytes所依赖的后面的test.c文件的文件修改时间要比mytest这个文件新,那么,他就会执行后面所定义的命令来生成mytest这个文件。

4、如果mytest所依赖的test.c文件不存在,那么make会在当前文件中找目标为test.c文件的依赖性,如果找到则再根据那一个规则生成test.c文件。

5、make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

注:在make推导的时候会根据依赖关系而推导,从上到下,当依赖文件列表不存在会继续根据依赖文件列表所对应的项而继续。 

4、伪目标

这里的.PHONY:被该关键字修饰的对象是一个伪目标。伪目标表示该目标总是被执行的。比如:上面的clean,只要你一直输入命令,它就会一直执行。

而非伪目标,并不能总是执行成功,比如:上面的例子,一旦你make好了,即生成了mytest后,除非你修改了test.c,不然你是无法再重新make的。 


四、进度条程序

接下来,我们就用上面学到的内容来写一个简单的进度条程序。

1、缓冲区问题

1、概念

首先,我们来看一看下面的代码:

运行结果就是先输出字符串hello world然后休眠3秒之后结束运行。那么对于以下代码呢? 

上述代码的结果就是:我们看到程序先休眠了3秒,然后打印字符串hello之后结束运行。

这是为什么呢?上面的两个代码,唯一的区别就是一个有 “\n”,一个没有。而且,我们知道,程序一定是从上到下依次执行的,那为什么第二个代码我们看到的是先休眠呢?这就和缓冲区有关了。

其实,第六行的代码早就执行完了,只是信息没有被立马显示出来。

理由是:显示器对应的是行刷新,即当缓冲区当中遇到“\n”或是缓冲区被写满才会被打印出来,而在第二份代码当中并没有“\n”,所以字符串hello先被写到缓冲区当中去了,然后休眠3秒,直到程序运行结束时才将hello打印到显示器当中。

那如果我们不加\n,有没有什么方法能够帮助我们解决这个问题呢?这里我们可以使用fflush函数,该函数可以刷新缓冲区,即将缓冲区当中的数据刷新当显示器当中。

这下我们看到的结果就是先打印hello,再休眠了。 

2、\r和\n

\r: 回车,使光标回到本行的起始位置。
\n: 换行,使光标移动到当前位置的正下方的位置。

注:我们键盘中的回车按键相当于两者的结合。而在语法中,\n就是两者的结合。

2、代码编写

倒计时程序

有了上面 \r 回车的概念,那么如果我们向显示器上写了一个数之后再让光标回到本行的起始位置,然后再写一个数,不就相当于将前面一个数字覆盖了吗?然后我们使用循环,不就可以实现连续覆盖了吗,这就相当于一个倒计时程序。如下:

运行结果:

有了倒计时代码,我们就可以写进度条代码:

运行结果如下:

注:%-100s:表示预留100的空间,-表示从左到右进行打印。如果不加-,将会从右向左打印。%%表示百分号。 

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

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

相关文章

第五篇 《随机点名答题系统》——抽点答题详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.界面设计 3.流程设计 4.关键代码 随机点名答题系统(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统),是基于php(8.2.11),Java…

迪克森电荷泵

迪克森电荷泵(Dickson Charge Pump)是一种电压倍增器电路,可以将低电压升高到较高电压,相对于其他电压升压电路,迪克森电荷泵具有较高的效率和较简单的电路结构。该电路的基本原理是通过电容和开关来实现电荷的积累和转…

上海亚商投顾:三大指数小幅上涨 HBM概念股全天强势

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数早盘窄幅震荡,午后集体拉升翻红,黄白二线走势分化,题材热点快速轮…

计算两个向量的叉积numpy.cross()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算两个向量的叉积 numpy.cross() [太阳]选择题 请问代码中最后输出正确的是? import numpy as np a np.array([1, 2, 3]) b np.array([4, 5, 6]) c np.cross(a, b) pri…

C#,数值计算——插值和外推,Laplace_interp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Object for interpolating missing data in a matrix by solving Laplaces /// equation.Call constructor once, then solve one or more times /// </summary> …

初刷leetcode题目(3)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

Go语言常用命令详解(二)

文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…

《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

《数字图像处理-OpenCV/Python》连载&#xff08;44&#xff09;图像的投影变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变…

应用开发平台集成表单设计器系列之3——整体集成思路及表单设计器功能深度了解

背景 平台需要实现自定义表单功能&#xff0c;作为低代码开发的一部分&#xff0c;通过技术预研和技术选型&#xff0c;选择form-create和form-create-designer这两个组件进行集成作为实现方案。通过深入了解和技术验证&#xff0c;确认了组件的功能能满足需求&#xff0c;具备…

移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS

目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…

V100 GPU服务器安装GPU驱动教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

计算机网络——物理层-信道的极限容量(奈奎斯特公式、香农公式)

目录 介绍 奈氏准则 香农公式 介绍 信号在传输过程中&#xff0c;会受到各种因素的影响。 如图所示&#xff0c;这是一个数字信号。 当它通过实际的信道后&#xff0c;波形会产生失真&#xff1b;当失真不严重时&#xff0c;在输出端还可根据已失真的波形还原出发送的码元…

JVM垃圾回收相关概念

目录 一、System.gc()的理解 二、内存溢出与内存泄露 &#xff08;一&#xff09;OOM &#xff08;二&#xff09;内存泄露 三、StopTheWorld 四、垃圾回收的并行与并发 五、安全点与安全区域 &#xff08;一&#xff09;安全点 &#xff08;二&#xff09;安全区域 …

数据结构【DS】树与二叉树的应用

哈夫曼树 树的带权路径长度最小的二叉树WPL 路径长度【边数】 * 结点权值n个叶结点的哈夫曼树共有 2n-1 个结点 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对同一组权值&#xff0c;可能存在不同构的多棵哈夫曼树&#xff0c;但树的带权路径长度最小且唯一哈夫曼树…

C/C++高精度

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 为什么需要高精度算法&#xff1f; 由于c不能进行位数过高的数据运算&#xff0c;所以要通过模拟数组来进行运算&#xff0c;首先是加法。…

基于类电磁机制算法优化概率神经网络PNN的分类预测 - 附代码

基于类电磁机制算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于类电磁机制算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于类电磁机制优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

使用ChatGPT进行数据分析案例——贷款数据分析

目录 数据数据 每一行是一个记录,代表着一笔贷款,每一列是一个特征,一共1万多条数据,最后一列非常重要save_loans是否成功收回

SpringBean的配置详解 --中

目录 Bean的初始化和销毁方法配置 Bean的初始化和销毁方法配置 扩展 Bean的实例化 Bean的初始化和销毁方法配置 当lazy-init设置为true时为延迟加载&#xff0c;也就是当Spring容器加载的时候&#xff0c;不会立即创建Bean实例&#xff0c;等待用到时再创建Bean实例并存储到单…

[AutoSar]CP autosar 面试题

目录 关键词前言面试官提问答案 关键词 嵌入式、C语言、autosar、面试题 前言 以前面试中的一些常提到的问题&#xff0c;在这里整理一下&#xff0c;希望对要去面试的道友有所帮助。 其中问题的答案后续有时间会再更新整理。 面试官提问 1.Autosar 概述&#xff1a; 解释 …

传输层协议-TCP协议

目录 TCP协议格式理解可靠性序号与确认序号16位窗口大小六个标志位连接管理机制三次握手四次挥手 确认应答机制&#xff08;ACK&#xff09;超时空重传机制流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP/UDP对比用UDP实现…