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

目录

一、概念

二、使用实例

 三、原理

四、进度条程序

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.mzph.cn/news/148746.shtml

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

相关文章

Open AI开发者大会:AI“科技春晚”

ChatGPT的亮相即将满一年之时,OpenAI举行了自己的首次开发者大会。OpenAI首席执行官Sam Altman宣布推出最新的大模型GPT-4 Turbo。正如“Turbo”一词的中文含义“涡轮增压器”一样,本次发布会上,OpenAI的这款最新大模型在长文本、知识库、多模…

Django+Vue项目创建 跑通

参考链接: 【精选】DjangoVue项目构建_django vue-CSDN博客 一、背景 主要介绍如何使用后端Django 前端Vue 的技术栈快速地搭建起一套web项目的框架。 为什么使用Django和Vue? Django是Python体系下最成熟的web框架之一,由于Python语言的易用…

【心得】PHP的文件上传个人笔记

目录 1 php的文件上传绕过 黑名单绕过 2 php文件上传的00截断 3 iconv字符转换异常后造成了字符截断 4 文件后缀是白名单的时候的绕过 web服务器的解析漏洞绕过 5.高级文件上传绕过 1 .htaccess nginx.htaccess 2 服务端内容检测 3 配合伪协议来绕过 4.配合日志包含绕…

Word2Vec浅谈

论文地址:Efficient Estimation of Word Representations in Vector Space 个人认为,word2vec主要解决的问题是one-hot中维度过高并且稀疏的问题。word2vec是Google团队在2013年发表的一篇paper,当时一经问世直接将NLP领域带到了一个新的高度…

038、语义分割

之——介绍与数据集 杂谈 语义分割,语义分割(Semantic Segmentation)方法-CSDN博客: 语义分割是计算机视觉领域的一项重要任务,旨在将图像中的每个像素分配到其对应的语义类别中。与物体检测或图像分类不同,语义分割不仅要识别图像…

Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)

Golang起步篇 Golang起步篇一. 安装Go语言开发环境1. Wondows下搭建Go开发环境(1). 下载SDK工具包(2). 解压下载的压缩包,放到特定的目录下,我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3). 配置环境变量步骤1:先打开环境变…

数据结构【DS】特殊二叉树

完全二叉树 叶子结点只能出现在最下层和次下层, 最下层的叶子结点集中在树的左部完全二叉树中, 度为1的节点数 0个或者1个【计算时可以用这个快速计算, 配合𝑛0𝑛21】若n为奇数,则分支节点每个都有左右孩子;若n为偶数&#xff0…

【STM32】ADC(模拟/数字转换)

一、ADC的简介 1.什么是ADC 1)将【电信号】-->【电压】-->【数字量】 2)ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁。 3)12位逐次逼近型ADC,1us转换时间&#xf…

六大排序(插入排序、希尔排序、冒泡排序、选择排序、堆排序、快速排序)未完

文章目录 排序一、 排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序: 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…

“新KG”视点 | 知识图谱与大语言模型协同模式探究

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力,知识图谱则丰富了表示知识的方式,两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下,OpenKG组织…

数字IC前端学习笔记:异步复位,同步释放

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 异步复位 异步复位是一种常见的复位方式,可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误,复位释放便是…

读像火箭科学家一样思考笔记03_第一性原理(上)

1. 思维的两种障碍 1.1. 为什么知识会成为一种缺陷而非一种美德 1.1.1. 知识是一种美德 1.1.2. 知识同样的特质也会把它变成一种缺点 1.1.3. 知识确实是个好东西,但知识的作用应该是给人们提供信息,而不是起约束作用 1.1.4. 知识应该启发智慧&#…

新版JetBrains ToolBox【Windows】修改应用安装位置

WIndows下新版的JetBrainse ToolBox 无法修改应用安装路径 关闭 ToolBox 应用修改配置文件.settings.json 路径:C:\Users\用户名\AppData\Local\JetBrains\Toolbox "install_location": "xxx",

多线程概述

文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法,通过引入故障来找到系统的bug,验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发,是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…

SpringBoot中日志的使用log4j

SpringBoot中日志的使用log4j 项目中日志系统是必不可少的,目前比较流行的日志框架有 log4j、logback 等,这两个框架的作者是同一个 人,Logback 旨在作为流行的 log4j 项目的后续版本,从而恢复 log4j 离开的位置。 另外 slf4j(…

vulhub redis-4-unacc

环境搭建 cd vulhub/redis/4-unacc docker-compose up -d 漏洞复现 检测 redis-cli -h ip 使用redis工具 工具地址:https://github.com/vulhub/redis-rogue-getshell 下载完成后,先进入RedisModulesSDK/exp/ 目录进行make操作 获得exp.so后可以进行…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示,持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…