【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一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!

相关推荐
LIKEYYLL14 分钟前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu
云云3211 小时前
搭建云手机平台的技术要求?
服务器·线性代数·安全·智能手机·矩阵
云云3211 小时前
云手机有哪些用途?云手机选择推荐
服务器·线性代数·安全·智能手机·矩阵
cominglately1 小时前
centos单机部署seata
linux·运维·centos
魏 无羡1 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse1 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
Karoku0662 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
木子Linux2 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8242 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维2 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs