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

个人主页:平行线也会相交

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创

收录于专栏【Linux专栏】🎈

本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌

目录

💫文章导读

make是一个命令,而Makefile是当前目录的一个文件

make/Makefile是完成大型项目非常好用的工具。它可以帮助项目团队更好地组织和管理代码,提高构建效率和可维护性,从而加快项目开发和交付的速度。

可以毫不犹豫地这样说:会不会写Makefile,从侧面说明了一个人是否具备完成大型项目的能力。

💫make和Makefile的关系

make和Makefile是紧密相关的概念,两者结合使用可以实现自动化的项目构建和管理。make通过读取Makefile文件,根据其中的规则和命令来执行构建任务,而Makefile提供了一种描述规则和依赖关系的格式,使得构建过程可以被自动化和可重复使用。

💦make

make是一个构建工具 ,用于自动化构建软件项目

make命令执行后,会自动的在当前目录下寻找Makefile/makefile文件,然后根据Makefile/makefile文件内部对应的依赖关系执行对应的依赖方法形成目标文件。

💦Makefile

Makefile是一个文本文件,它包含了一系列的规则和命令,用于描述项目的构建过程。Makefile中定义了目标(target)以及每个目标的依赖关系、构建规则和执行命令。这些规则和命令告诉make如何根据源代码文件和依赖关系自动化地执行编译、链接和其他构建操作。

创建一个Makefile文件:

cpp 复制代码
touch Makefile

编译Makefile文件:

cpp 复制代码
vim Makefile

依赖关系:mycode:test.c。mycode可执行文件之所以能够生成是因为mycode可执行文件依赖于源文件test.c。

但是仅仅有以来关系是不够生成mycode可执行文件的,我们还得有依赖方法。

依赖方法:gcc -o mycode test.c

💦依赖关系

Make 工具会从指定的目标开始,根据 Makefile 文件中所定义的依赖关系进行递归扫描

当执行 make 命令时,如果没有指定目标,默认会执行 Makefile 文件中的第一个目标。Make 工具首先会检查该目标的依赖关系。如果该目标有依赖项,工具会继续递归扫描这些依赖项的依赖关系,并按照依赖关系的顺序执行相应的命令。

下面举一个更详细的例子来解释依赖关系:

执行make命令后:

解释:

mycode依赖于mycode.o

mycode.o依赖于mycode.s

mycode.s依赖于mycode.i

mycode.i依赖于test.c
但是真正保存这种依赖关系的结构是栈式结构(先进后出)。

💦依赖方法


上图中的黄体字就是具体的依赖方法。

💫项目清理(make clean)

执行 make clean 命令后,会按照 clean 目标下定义的依赖方法依次执行,删除所指定的文件或文件夹。


💫拓展

拓展一:

如果想要禁止显示命令本身,只输出命令执行结果,可以在命令前加上@。即通过在每个命令规则行前添加@,可以阻止显示命令本身,只输出命令执行结果。


拓展二(特殊符号):

$@ 表示当前目标(Target)
$^ 表示所有的依赖项

💫总结

  • make是一个指令,makefile是一个文件,二者互相配合来使用
  • make命令会自动推导makefile文件中的依赖关系,整个推导的过程是栈式结构。
  • Make 工具从指定的目标开始执行,默认是第一个目标。如果未指定目标,则执行默认目标,通常是 Makefile 文件中的第一个目标。
  • make会根据源文件和目标文件的新旧来判定是否需要重新执行依赖关系进行编译。所以gcc命令不一定总是要执行的。
  • .PHONY:用于声明一个伪目标(Phony Target)总是执行目标下定义的命令。

好了,以上就是本文的全部内容,主要对项目自动构建化工具-make/Makefile一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!

相关推荐
wanhengidc1 天前
巨 椰 云手机离线多开
运维·服务器·科技·智能手机·云计算
代码游侠1 天前
应用——管道与文件描述符
linux·服务器·c语言·学习·算法
wefg11 天前
【Linux】环境变量
linux·运维·服务器
扫地生大鹏1 天前
Linux登录用户名密码正确,报错Linux 登录报module is unknow
linux·运维·服务器
月巴月巴白勺合鸟月半1 天前
一个医学编码的服务
服务器·前端·javascript
可爱又迷人的反派角色“yang”1 天前
ansible基本命令与剧本编写(二)
linux·运维·ansible
老王熬夜敲代码1 天前
linux系统IO
linux·笔记
Thexhy1 天前
基础篇:Redis核心命令及用法
java·linux·redis
不染尘.1 天前
虚拟网络环境及socket概述
linux·c语言·网络·windows·计算机网络
馨羽的玩具1 天前
麒麟虚拟机原盘扩容后没看到
linux·麒麟