『Linux从入门到精通』第 ⑧ 期 - 项目自动化构建工具——make/Makefile

简介: 『Linux从入门到精通』第 ⑧ 期 - 项目自动化构建工具——make/Makefile

0000000000000.png

目录


make与Makefile的关系

Makefile

make

项目清理

clean

.PHONY


文章导读


本章主要内容有认识与学习Linux环境下如何使用项目自动化构建工具——make/makefile。


当我们编写一个较大的软件项目时,通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程,我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动化构建和管理软件项目,从而提高效率和可靠性。它还可以跨平台使用,因为 make 工具可以在各种不同的操作系统和编译器上运行。


正文


make与Makefile的关系


Makefile


Makefile 文件包含了一系列规则,每个规则描述了如何从源文件生成目标文件。在每个规则中,我们定义了目标文件和其依赖关系,并且指定了需要执行的命令。

示例:

创建一个新文件 Makefile

touch Makefile


编辑 Makefile 文件;

//vim进行编辑
vim Makefile
//写入内容
Test : Test.c
    gcc Test.c -o Test
//保存退出

这样就写好了一个 Makefile 文件 了,那么这样写有什么含义呢?


其实每个 Makefile 文件存在的意义就是生成一个最终目标文件,而 Makefile 文件里最开始的文件就被认定为是最终目标文件(示例中的Test文件)。


示例中,要想生成目标文件 Test ,我们需要通过 Test.c 文件经过编译后生成目标文件 Test。所以Test.c 与 Test 产生了依赖关系,用 :表示。而接下来的  gcc Test.c -o Test 这条指令就是解释生成目标文件 Test 需要和 test.c 产生怎样的关系。


当然依赖关系有时候也可以不存在。因为 make 的目的是产生目标文件,不用管通过什么手段,也不管有没有目标文件,例如:

//没有依赖关系的示例
Test : 
    touch Test

有的时候,一个依赖关系可能不足以生成最终目标文件,此时我们还需建立多层依赖关系,例如:

Test : test.o
   gcc test.o -o Test 
test.o : test.s
   gcc -c test.s -o test.o
test.s : test.i
   gcc -S test.i -o test.s
test.i : Test.c
   gcc -E Test.c -o test.i 


为了生成最终的目标文件 Test ,系统会根据依赖关系一层一层的寻找下去。如上例,要生成Test,就得找到 test.o,要生成 test.o 就要生成 test.s...,在这样一层一层的寻找的时候,如果有哪个过程中出现了断层(生成目标文件失败),则会出现报错。


上个示例结果如下,make 指令执行 Makefile 后,不仅最终目标文件生成了,过程中的目标文件也都会生成:

14.png

明白了Makefile是什么之后,再来看一看make指令。


make


make是一条指令,它与Makefile相伴相生。


当我们执行 make 命令时,make 工具会读取 Makefile 文件,并根据其中的规则来生成目标文件。它会检查每个规则中的依赖关系和目标文件的最新修改时间,从而决定哪些规则需要执行。


通俗讲就是,系统为了效率,并不会对已经生成的目标文件且未曾改动的目标文件再作复杂的编译后重新生成。


它会检查目标文件的最后一次更新的时间,如果发现这个时间发生在上次生成该文件之后,则说明该文件被修改过,需要重新编译;反之则无需再重新编译。

当我们只输入 make 指令时,它会默认最终目标文件。倘若我们只是想生成过程中的某一个目标文件,则需要指定该文件名。例如:只需生成 test.o 即可:

Test : test.o
   gcc test.o -o Test 
test.o : test.s
   gcc -c test.s -o test.o
test.s : test.i
   gcc -S test.i -o test.s
test.i : Test.c
   gcc -E Test.c -o test.i 
make test.o

结果如下:

111.png


项目清理


clean


在 Makefile 中,一般还会加入一个目标文件 clean 且用 .PHONY 修饰 ,其作用是清理生成项目文件。例如:

Test : test.o
    gcc test.o -o Test 
test.o : test.s
    gcc -c test.s -o test.o
test.s : test.i
    gcc -S test.i -o test.s
test.i : Test.c
    gcc -E Test.c -o test.i
.PHONY : clean 
clean : 
    rm -f Test test.i test.s test.o  


.PHONY


被 .PHONY 修饰的目标文件意为 总是被执行的。例如,我们执行 make test.o 命令后,可以执行,但是第二次却不行了,因为该目标文件已经存在且为最新。但是被 .PHONY 饰后可以一直被执行。

123.png124.png

目录
相关文章
|
16天前
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
14天前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
32 5
Linux系统之安装Ward服务器监控工具
|
16天前
|
JSON JavaScript Linux
Linux系统之安装cook菜谱工具
【10月更文挑战第15天】Linux系统之安装cook菜谱工具
32 2
Linux系统之安装cook菜谱工具
|
2天前
|
Unix Linux Shell
linux入门!
本文档介绍了Linux系统入门的基础知识,包括操作系统概述、CentOS系统的安装与远程连接、文件操作、目录结构、用户和用户组管理、权限管理、Shell基础、输入输出、压缩打包、文件传输、软件安装、文件查找、进程管理、定时任务和服务管理等内容。重点讲解了常见的命令和操作技巧,帮助初学者快速掌握Linux系统的基本使用方法。
16 3
|
5天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
26 1
|
5天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
11 1
|
10天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。
|
30天前
|
机器学习/深度学习 Linux 编译器
Linux入门3——vim的简单使用
Linux入门3——vim的简单使用
54 1
|
20天前
|
Web App开发 Java 测试技术
一、自动化:web自动化。Selenium 入门指南:从安装到实践
一、自动化:web自动化。Selenium 入门指南:从安装到实践
30 0
|
21天前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)