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

news2024/11/25 0:41:34

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【Linux专栏】🎈
本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 💫文章导读
  • 💫make和Makefile的关系
    • 💦make
    • 💦Makefile
    • 💦依赖关系
    • 💦依赖方法
  • 💫项目清理(make clean)
  • 💫拓展
  • 💫总结

💫文章导读

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文件:

touch Makefile

编译Makefile文件:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab cross()函数叉乘 计算过程详解

向量叉乘 在数学上,两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中,用函数cross实现。 函数 cross() 格式 C cross(A,B) %若A、B为向量,则返回A与B的叉乘,即CAB,A、B必须是3个…

c#封装bool到cpp

c#那边传一个结构体,结构体里包含两个bool,封送到cpp,结果发现cpp那边读取有问题。一看cpp接收变量的内存,两个bool占的内存都不是一个字节了,再次记录原因。 封送的时候,默认是占4个字节,如果…

Pycharm----导入库文件夹不在py文件的目录下

问题描述: 想在不同目录下导入根目录的包,直接写会报错。如下边object_detect.py在function文件夹下,导入包默认在这个文件下,但我想导入根目录models和utils下的包 解决方法: 将根目录设置为源代码根目录&#xff0…

linux静态库,动态库总结

1.介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译&#xff…

【Spring Cloud】Hystrix熔断机制

文章目录 前言什么是hystrix的熔断?使用hystrix熔断功能的配置Hystrix 工作原理Hystrix工作流 前言 什么是hystrix的熔断? hystrix熔断主要是指在一定的时间窗口内,当请求的次数达到一定的失败比率后,hystrix就会主动拒绝服务&a…

【图像分割】基于浣熊优化算法COA的Otsu(大津法)多阈值电表数字图像分割 电表数字识别【Matlab代码#52】

文章目录 【可更换其他算法,获取资源请见文章第5节:资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 多阈值Otsu原理3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法,获取资源请见文章第5节:资源获取】 1. 原始…

长尾式差分放大电路

3.3.2差分放大电路 电路 条件 静态分析 对共模信号的抑制作用 当产生温度变化时,也类似加入了共模信号,由于负反馈电阻 的存在,会产生如下变化。 对差模信号的放大作用 电路 交流等效电路 具体分析 具有恒流源的差分放大电路 电路 详细分析…

STM32 OLED显示汉字及屏幕滚动(I2C协议)

文章目录 一、任务目标二、材料准备硬件:软件: 三、AHT20温湿度传感器的使用四、OLED的使用1.硬件2.字模汉字编码原理取字模 3.工程4.电路连接5.实验效果 五、总结六、参考资料 一、任务目标 理解OLED屏显和汉字点阵编码原理,使用STM32F103的…

Linux下基本指令 -> ls指令

​ Linux - ls 1 简介2 简介3 语法4 常用选项4.1 -a 列出目录下的所有文件,包括以 . 开头的隐含文件4.2 -l 列出文件的详细信息4.3 -d 将目录象文件一样显示,而不是显示其下的文件4.4 -i 输出文件的 i 节点的索引信息4.5 -n 用数字的 UID,GID 代替名称4.…

Qt学习14:Designer设计师

文章首发于我的个人博客:欢迎大佬们来逛逛 Qt项目地址及源码:点击这里 什么是Designer设计师? 简单来说就是通过拖拖拽拽就可以实现窗口上控件的布局。 1. 创建带UI文件的项目 我们在之前的学习中都是不用这个按钮的,现在我们需…

富文本CKEditor5简易入门,包括自定义上传图片(html版+vue.js)

一、安装及引入 官网&#xff1a;https://ckeditor.com/ckeditor-5/download/ 我这边使用的是自定义构建&#xff0c;然后下载下来。 二、简单使用 引入js <script src"../../../assets/plugins/ckeditor5/ckeditor.js"></script>html&#xff1a;…

【PWN · ret2libc】[BJDCTF 2020]babyrop

这题是经典的ret2libc&#xff0c;而且保护开的也不多&#xff0c;实际上&#xff0c;这篇博客的意义更大&#xff1a; 【PWN ret2libc】[2021 鹤城杯]babyof_Mr_Fmnwon的博客-CSDN博客 目录 前言 一、题目 二、思路 三、exp具体编写 总结 前言 简单而纯粹的ret2libc&am…

《DocRED: A Large-Scale Document-Level Relation Extraction Dataset》阅读笔记

引言 近期关注篇章级关系抽取&#xff0c;两个原因&#xff0c;一是之前做大规模知识抽取&#xff0c;遗留的一块内容就是篇章级关系抽取和事件抽取&#xff1b;另一个是大模型目前在抽取任务&#xff0c;特别是复杂抽取任务上表现不如其他NLP任务&#xff0c;这也引起我的研究…

5.2.6.字符设备驱动工作原理1

什么是模块&#xff1f;什么是驱动&#xff1f; 模块 驱动的雏形&#xff0c; 你要能操控硬件才叫驱动 在空的模块的基础上&#xff0c;安装驱动 5.2.6.1、系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API&#xff1a;open、read、write、close等 (3)驱动…

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效!

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效&#xff01; 2023/7/20 12:42 &#xff1f;做YouTube挣钱吗&#xff1f; 115网盘 满了。最新 张家界 旅游的视频 放到 youtube就是 60岁/老了的时候的回忆&#xff01; 放到 大陆不保险&#xff01; 如需使用自动翻…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

Spring(二):更简单的存储与读取 Bean

通过上一章的Spring&#xff0c;我们基本实现了Spring 的读取与存储&#xff0c;但是在操作过程中&#xff0c;读取与存储并没有那么得“简单” 一套流程还是很复杂&#xff0c;所以&#xff0c;本章来介绍更加简单得读取与存储。 在 Spring 中想要更简单的存储和读取对象的核…

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】继承基础知识及简单应用&#xff0c;使用reportSingleClassLayout&#xff08;在Visual Studio开发人员命令提示窗口&#xff09;查看派生类详细信息 website&#xff1a;黑马程序员C date&#xf…

MySQL 读写分离

目录 一、什么是读写分离&#xff1f; 二、为什么要读写分离呢&#xff1f; 三、什么时候要读写分离&#xff1f; 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1&#xff09;基于程序代码内部实现 2&#xff09;基于中间代理层实现…

比selenium体验更好的ui自动化测试工具: cypress介绍

话说 Cypress is a next generation front end testing tool built for the modern web. And Cypress can test anything that runs in a browser.Cypress consists of a free, open source, locally installed Test Runner and a Dashboard Service for recording your tests.…