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

相关推荐
南瓜胖胖5 分钟前
【seismic unix相速度分析-频散曲线】
服务器·unix
IT成长日记3 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
热爱生活的猴子3 小时前
阿里云服务器正确配置 Docker 国内镜像的方法
服务器·阿里云·docker
物联网老王5 小时前
Ubuntu Linux Cursor 安装与使用一
linux·运维·ubuntu
艾伦_耶格宇6 小时前
【ACP】阿里云云计算高级运维工程师--ACP
运维·阿里云·云计算
一位摩羯座DBA7 小时前
Redhat&Centos挂载镜像
linux·运维·centos
学习3人组7 小时前
CentOS配置网络
linux·网络·centos
计算机毕设定制辅导-无忧学长7 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
weixin_307779138 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习
漫步企鹅8 小时前
【蓝牙】Linux Qt4查看已经配对的蓝牙信息
linux·qt·蓝牙·配对