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

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



一、概念

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,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的空间,-表示从左到右进行打印。如果不加-,将会从右向左打印。%%表示百分号。

目录
相关文章
|
2月前
|
jenkins Java 持续交付
运用Jenkins实现Java项目的持续集成与自动化部署
在新建的Jenkins Job中,我们需要配置源码管理,通常选择Git、SVN等版本控制系统,并填入仓库地址和凭据。接着,设置构建触发器,如定时构建、轮询SCM变更、GitHub Webhook等方式,以便在代码提交后自动触发构建过程。
113 2
|
2月前
|
C语言 开发者
Makefile 简介:自动化你的构建过程
一旦`Makefile`被正确设置,你只需要在命令行中运行命令`make`,它会查找当前目录下的`Makefile`文件,并执行其中定义的规则来构建目标。`make`命令非常智能,它会检查文件的时间戳,只重新编译那些自上次编译后有改动的文件。 总之,`Makefile`是开发者的强大工具,能够大幅提升软件开发的效率和准确性。通过学习和使用`Makefile`,你可以更有效地管理项目构建过程,使其自动化、高效且可靠。
26 1
|
6天前
|
jenkins Java 持续交付
自动化魔法:用Jenkins打造Java项目的持续部署流水线
【8月更文挑战第13天】在软件开发中,自动化部署是提高效率与减少错误的关键。Jenkins作为一款强大的持续集成工具,支持Java项目的自动化构建、测试与部署。通过配置Jenkins及其丰富的插件生态(如Git和Maven插件),可实现从代码提交到上线的全自动化流程。此流程包括从GitHub自动拉取代码、使用Maven构建项目,并通过如`mvn clean install`命令执行构建,最后利用插件如“Publish Over SSH”将制品部署至远程服务器。此外,还可配置邮件通知等后处理动作确保发布的稳定可靠。借助Jenkins,开发者能显著加速软件交付周期,同时减少手动操作带来的风险。
22 0
|
1月前
|
运维 数据安全/隐私保护 Python
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
71 14
|
21天前
|
存储 JavaScript Serverless
函数计算产品使用问题之如何实现项目自动化部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
JSON 程序员 数据格式
豆瓣评分9.6!用81个项目带你从Python 3零基础到Python自动化
Python的名字来自超现实主义的英国喜剧团体,而不是来自蛇。Python程序员被亲切地称为Pythonistas。Monty Python和与蛇相关的引用常常出现在Python的指南和文档中。
|
2月前
|
JSON 程序员 数据格式
豆瓣评分9.6!用81个项目带你从Python 3零基础到Python自动化
Python的名字来自超现实主义的英国喜剧团体,而不是来自蛇。Python程序员被亲切地称为Pythonistas。Monty Python和与蛇相关的引用常常出现在Python的指南和文档中。
|
1月前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
83 0
|
2月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
29 0
|
2月前
|
Java API Maven
Gradle 自动化项目构建-Gradle 核心之 Project
Gradle 自动化项目构建-Gradle 核心之 Project
39 0

热门文章

最新文章