【Linux】项目自动化构建工具-make/Makefile的使用

简介: 【Linux】项目自动化构建工具-make/Makefile的使用

前言


🎐在使用 Linux 的时候应该已经察觉到,在 Linux 环境下我们会有非常多的源文件,并且在使用前还需要手动编译,在使用的时候就会变得非常地麻烦。


🎐但 make/Makefile 的出现就解决这些问题, Makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。 Makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。


🎐同时,值得注意的一点是, make 是使用时输入的命令,而 Makefile 是一个文件里面包含了构建编译所需要的一系列规则。

依赖


🎐使用 make/Makefile 完成一件事情的前提就是需要正确的依赖关系+正确的依赖方法。

依赖关系


🎐可以简单的理解为,文件1来源于文件2则说明文件1依赖于文件2。例如我要得到可执行文件 text ,在那之前我必须先要有作为源文件的 text.c 才能对其进行编译进而得到 text ,便称 text 依赖于 text.c

依赖方法


🎐依赖方法就是在依赖的关系之上将二者进行连接的方法,还是上面的例子,我们知道了 text 依赖于 text.c ,那二者之间的依赖方法就是通过 gcc 进行编译的命令 gcc -o text text.c 了。

使用


🎐为了方便理解将编译链接的各各步骤拆分出来进行讲解。

 text:text.o                      //text依赖于text.o
      gcc -o text text.o
  text.o:text.s                   //text.o依赖于text.s
      gcc -c -o text.o text.s     
  text.s:text.i                   //text.s依赖于text.i
      gcc -S -o text.s text.i
  text.i:text.c                   //text.i依赖于text.c
      gcc -E -o text.i text.c

make 会在当前目录下找名字叫 Makefile 或 makefile 的文件(要自己创建)。如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到 text 这个文件,并把这个文件作为最终的目标文件。


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


如果 text 所依赖的 text.o 文件不存在,那么 make 会在当前文件中找目标为 text.o 文件的依赖性,如果找到则再根据那一个规则生成 text.o 文件。(这有点像一个堆栈的过程)


你的C文件和H文件是存在的,于是 make 会生成 text.o 文件,然后再用 text.o 文件声明

make 的最终任务,就是得到可执行文件 text 。


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


在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不管。


make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,就会停止运行。

项目清理


🎐如上的使用make之后会生成 make.i make.s make.o make 四个文件,每次都输入一长串命令去删除未免过于麻烦,可以将删除项目文件也并入 Makefile 之中。

.PHONY: clean
clean:
    rm -f text.i text.s text.o 

🎐.PHONY 是make/Makefile语法中的一个关键字,代表的意思是:总是被执行的。举个例子,当我们使用 make 生成 text 之后上一次修改 text.c 的时间仍晚于 text 且再次使用 make 则不会生成新的 text 。

[Alpaca@VM-12-9-centos myfile]$ make
gcc -o text text.c
[Alpaca@VM-12-9-centos myfile]$ make
make: `text' is up to date.
[Alpaca@VM-12-9-centos myfile]$ make
make: `text' is up to date.

🎐若是将text也并入 .PHONY 之中这个命令就是总是被执行的,有以下两种写法可以自由选择。

.PHONY: clean text 
text:text.o                      //text依赖于text.o
      gcc -o text text.o
text.o:text.s                    //text.o依赖于text.s
      gcc -c -o text.o text.s     
text.s:text.i                    //text.s依赖于text.i
      gcc -S -o text.s text.i
text.i:text.c                    //text.i依赖于text.c
clean:
    rm -f text.i text.s text.o 
.PHONY: text 
text:text.o                      //text依赖于text.o
      gcc -o text text.o
text.o:text.s                    //text.o依赖于text.s
      gcc -c -o text.o text.s     
text.s:text.i                    //text.s依赖于text.i
      gcc -S -o text.s text.i
text.i:text.c                    //text.i依赖于text.c
      gcc -E -o text.i text.c
.PHONY: clean
clean:
    rm -f text.i text.s text.o 

🎐精简之后就是这个样子的。

text:text.c                   //text依赖于text.c(依赖关系)
    gcc -o text text.c        //使用gcc对text进行编译链接得到text.c(依赖方法)
.PHONY: clean                 //clean总是被执行                                                                                                                             
clean:                        //clean也是一个文件且不依赖于其他文件(依赖关系)
    rm -f text                //通过rm删除可执行文件(依赖方法)

在make/Makefile的帮助下可以有效地提升 Linux 的使用效率,好了,这次 make/Makefile 的介绍就到这里结束了,关注博主共同进步!!

目录
相关文章
|
22天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
2月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
251 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
47 2
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
76 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
4月前
|
Web App开发 编解码 Linux
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
这篇文章介绍了使用Selenium自动化测试解决报告生成失败问题的方法,包括Linux环境下的部署指南和代码实现。
55 1
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
|
4月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
51 8
|
4月前
|
存储 监控 Linux
|
4月前
|
存储 运维 监控
|
4月前
|
持续交付 C# 敏捷开发
“敏捷之道:揭秘WPF项目中的快速迭代与持续交付——从需求管理到自动化测试,打造高效开发流程的全方位指南”
【8月更文挑战第31天】敏捷开发是一种注重快速迭代和持续交付的软件开发方法,通过短周期开发提高产品质量并快速响应变化。本文通过问题解答形式,探讨在Windows Presentation Foundation(WPF)项目中应用敏捷开发的最佳实践,涵盖需求管理、版本控制、自动化测试及持续集成等方面,并通过具体示例代码展示其实施过程,帮助团队提升代码质量和开发效率。
75 0
|
4月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
55 0