【闪击Linux系列P6】自动化构建工具-make/Makefile详解

news2024/9/20 18:47:07

1175ee7859cc48aea62cd5d09ac60a8a.png

 前言

  • 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!
  • 本章主要内容面向接触过Linux的老铁,主要内容含

bd9b7e30a16a43ea9ccc7a148e4d3d9b.png

欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 

订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀
【Linux系列-P1】 Linux环境的搭建
【Linux系列-P2】Linux的基本知识与指令
【Linux系列-P3】Linux的权限
【Linux系列-P4】Linux基本工具[yum][vim]

目录

一.make/Makefile背景简介

二.依赖关系与依赖方法

三.makefile特性:依赖关系的自动推导

四. make特性:根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译

五. 【.PHONY】与伪目标的应用

引入:而我们需要怎么样才能够让make每次都执行呢?

常规应用: 【.PHONY】修饰clean,让clean对应的依赖方法每次都被执行

六.特殊符号【$@】【$^】表示文件


一.make/Makefile背景简介

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
  • make会自上而下扫描makefile文件,把第一个当作默认指令(例如把clean:放在开头,make的操作就是clean),所以正常情况下我们都是将要执行的程序放在开头,把clean放在下面,要用clean时,才用【make clean】调用。
  • make命令是系统默认携带的(下图中可见,make在bin目录下)

817881de87c846e99bfe5f14ebfddcbf.png

  •  make会在当前目录下找对应的【依赖关系】与【依赖方法】;至于什么是依赖方法呢?详情见下文

二.依赖关系与依赖方法

引入:为了带大家更好了解依赖关系和依赖方法,YY下面给大家带来一个用例

  1. 我们先用vim创建一个makefile文件,并在当中[插入模式]中写入如图所示的依赖关系【mycode:mycode.c】与依赖方法【gcc -o mycode mycode.c】;
  2. 注意的特殊点:【clean:】其右侧没有东西,表示clean不依赖于任何文件;同理在【1】中,mycode依赖于mycode.c;
  3. 我们再用vim写一个mycode.c的文件 
  4. 当我们回到linux界面,输入make和make clean,即可清晰见到其的依赖方法;
  • 【PS:make是默认调用makefile中第一个操作,make clean是在makefile自上而下查找】

a931296d9888482a8650d21f372f8457.png


三.makefile特性:依赖关系的自动推导

  • 由以下用例可知结论:make会自动推导makefile中的依赖关系(其非常类似于递归结构,由于递归中涉及到函数栈帧的调用,我们也能明白其为栈式结构)
  • 改变先后顺序不影响;
  • 如果中途少了一组依赖关系(例如注释掉mycode.s: mycode.i)则无法运行;

11f42b1d03fe411fbad8924a0af7aed4.png


四. make特性:根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译

引入:当我们二次使用make指令时,会出现以下情况;这是编译器为了防止重复编译,提高效率;而这是怎么做到的呢?

90d730f9ef1b4835aa9857c0aedfc4c3.png

结论:

  • make指令会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译
  • 在任何操作中,一定是先有源文件(.c),才有可执行程序(.exe)
  • 一般而言,可执行程序的时间一定比源文件更加新
  • 如果我们更改了源文件,此时源文件就比可执行程序要更加新,此时执行make就可以实现;反之则会出现"is up to date"的反馈

五. 【.PHONY】与伪目标的应用

引入:而我们需要怎么样才能够让make每次都执行呢?

  • 使用【.PHONY】修饰mycode,令其成为伪目标
  • 伪目标的特性是,总是被执行的;

9b1bc17b17a34b28960eaa8052aa1c8b.png

常规应用: 【.PHONY】修饰clean,让clean对应的依赖方法每次都被执行

4f0a2990cbe5466491ee48303a811f05.jpeg


六.特殊符号【$@】【$^】表示文件

  • 用【$@】表示目标文件,【$^】表示冒号右侧文件

06f8496c025b4af790403098fcd30803.png

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

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

相关文章

〔012〕Stable Diffusion 之 中文提示词自动翻译插件 篇

✨ 目录 🎈 翻译插件🎈 下载谷歌翻译🎈 谷歌翻译使用方法🎈 谷歌翻译使用效果 🎈 翻译插件 在插件列表中搜索 Prompt Translator可以看到有2个插件选项:一个是基于谷歌翻译 〔推荐〕、一个基于百度和deepl…

什么是字体堆栈(font stack)?如何设置字体堆栈?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是字体堆栈(Font Stack)?⭐ 如何设置字体堆栈?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …

客服专用耳机哪个品牌好用,打电话好用的蓝牙耳机推荐

如果你喜欢户外运动时戴耳机,那绝对不能错过骨传导耳机!这种开放式耳道设计在跑步时非常实用,因为它可以让你快速察觉行人和车辆的动静,大大减少安全隐患。而且,这种耳机无需插入耳朵,可以让你的耳道长时间…

聊聊火车的发展

目录 1.火车的概念 2.火车的发展历史 3.火车对战争的影响 4.火车对人们出行造成的影响 1.火车的概念 火车是一种由机械动力驱动的陆上交通工具,通常用来运输人员和货物。它由一列或多列的连接在一起的车厢组成,有轨道作为其行驶的基础,并通…

AI商业化如何落地?看设计师如何利用AI细化工作流

自从AI爆火之后,人类是否会被AI取代一直都是打工人格外关注的问题。 而最近,在小编深入探索到我们用户的使用情况后,发现已经有人拿神采PromeAI直接实现了商业应用,将AI的设计创意应用得淋漓尽致,并且直接进军房地产及…

nvm-----node版本管理器

使用nvm来进行切换不同的node版本 我们在开发的时候有会很多的新老项目,有些老项目会要求使用低版本的node,但是新项目又会要求高版本的node,这个时候就是很纠结了。因为低版本的项目你用高版本的node进行启动会有启动失败或者代码保存的时候…

PO、BO、VO、DTO、DAO、POJO

文章目录 PO(Persistant Object)持久对象DO(Data Object)数据对象AO(Application Object)应用对象BO(Business Object)业务对象VO(Value Object)表现对象DTO&…

海外应用ASO优化的小技巧3

编写准确的应用程序描述,有4000个字符限制。用户可以访问应用程序的主要功能和信息,要说服并推动用户去下载我们的应用,需要使用自然流利的语言。 1、填写应用描述的方案。 我们需要知道该应用有什么用,能够解决什么问题&#xf…

latex 笔记:cs论文需要的排版格式

主要针对英文文献 1 基本环境 连字符 不同长度的"-"表示不同含义。 一个"-"长度的连字符用于词中两个"-"长度的连字符常用于制定范围三个"-"长度的连字符是破折号数学中的负数要用数学环境下的-得到 强调 在正式文章中, 通常不…

C++提高编程——模板

C提高编程 本阶段主要针对C泛型编程和STT技术做详细讲解,探讨C更深层的使用 1模板 1.1模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 寸照片模板: 1.2函数模板 C另一种编程思想称为 泛型编程,主要利…

Linux权限相关问题

权限 1. 权限概念su 2.权限管理2.1 权限设置方法2.1.1 chmod(change mode)chownchgrpumask 3.目录的权限粘滞位 权限总结 1. 权限概念 Linux下有两种用户:超级用户(ROOT),普通用户。 超级用户:可以Linux下的系统做任…

软件测试学术顶会——ISSTA 2023 论文(网络安全方向)清单、摘要与总结

总结 本次会议涵盖的安全研究主题广泛,包括源代码分析、二进制代码分析、恶意软件检测、漏洞检测、模糊测试、程序验证等。一些热门的研究方向包括:基于机器学习的漏洞检测、大型语言模型在软件安全中的应用、区块链智能合约安全分析。这些方向都在最近几年持续发展。一些较冷门…

c++ std::shared_ptr(内存布局)

https://cplusplus.com/reference/memory/shared_ptr/

基于Redis实现点赞及排行榜功能

微信公众号访问地址:基于Redis实现点赞及排行榜功能 推荐文章: 1、SpringBoot整合多数据源,并支持动态新增与切换(详细教程) 2、​​​​​​Redis中使用lua脚本 3、SpringBoot统一标准响应格式及异常处理 4、Spr…

牛客小白月赛75D题题解

文章目录 [ 矩阵](https://ac.nowcoder.com/acm/contest/60063/D)问题建模问题分析1.分析所求代码 矩阵 问题建模 给定一个n*m的字符矩阵,字符矩阵内包含两种字符’0’和’1’,从(1,1)出发,每次可以花费一单位时间向上下左右移动…

Gradle(一)Windows下安装

目录 一、简介二、下载和安装1.下载2.配置环境变量3.指定个人用户目录4.验证 三、IDEA 设置 Gradle 官网地址:https://gradle.org/官方文档: https://docs.gradle.org/current/userguide/userguide.html下载地址: https://gradle.org/release…

16.5.3 【Linux】SELinux 三种模式的启动、关闭与观察

并非所有的 Linux distributions 都支持 SELinux 的,所以你必须要先观察一下你的系统版本为何。 目前 SELinux 依据启动与否,共有三种模式,分别如下: enforcing:强制模式,代表 SELinux 运行中,…

Codeforces算法心得——A. Array Coloring

大家好,我是晴天学长,确实全世界最大的算法竞赛平台有很多独特且创新的地方,后面我会持续的更新的!加油!💪💪💪 1 )A. Array Coloring 2) .算法思路 数组中的奇数个数一…

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——注意力分数(详细数学推导代码实现) 📚订阅专栏:机器学习…

导读-Linux简介

Linux简介 ​ 总所周知,计算机系统包含硬件和软件两部分。硬件部分被称为裸机,主要包括中央处理器(CPU)、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…