【Linux】自动化构建工具-make/Makefile详解

2023-07-16 19:13:14

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

更多推荐

ChatGPT技术原理

Task03ChatGPT技术原理目录阶段一:有监督微调Supervisedfine-tuning(SFT)阶段二:训练回报模型(RewardModel,RM)阶段三:使用强化学习微调SFT模型ChatGPT是由GPT-3迭代来的,原有的GPT-3可能难以从文本中学会一些更高层次的表示,这就导致了GPT-3这样的语言模

指针和数组笔试题深度解析

学习之前我们将运用到sizeof和strlen函数sizeof和strlen函数认识和区别:1.strlen是一个库函数使用时需要引用#include<string.h>这个头文件,而sizeof是一个运算符号;2.strlen计算的是'\0'之前的字符个数,sizefo计算的是所占空间内存的大小,单位是字节;3.st

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群?为什么要使用集群架构?1.什么是集群?2.为什么要使用集群?2.1高性能2.2价格有效性2.3可伸缩性2.4高可用性2.5透明性2.6可管理性2.7可编程性3.集群的常见分类3.1负载均衡集群3.2高可用性集群3.3高性能计算集群3.4网格计算集群4.常用的集群软硬件介绍及选型4.1企业中常见的集群软硬件产

JSON注解和异常处理的使用

一、JSON数据返回1.1.前言JSON是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON的常用场景包括:前后端分离的项目中,后端向前端传送数据时。Ajax异步访问数据。RPC远程调用。除了JSON,还有其他的数据传输格式,如XML等。但是由于XML格式的特点,它在Web开发中使用较少。1.

【K8S系列】深入解析k8s网络插件—Canal

序言做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点在现代容器化应用程序的世界中,容器编排平台Kubernetes已经成为标准。Kubernetes是一个分布式系统,为了支持复杂的应用和微服务架构,网络是Kuberne

汽车充电桩浪涌保护器的应用方案和作用

随着电动汽车的普及,充电桩的建设也越来越多,但是充电桩也面临着雷电等自然灾害的威胁,如果没有有效的防雷措施,可能会造成充电桩的损坏,甚至引发火灾、爆炸等严重后果。因此,为了保证充电桩的安全运行,需要在充电桩中安装浪涌保护器,以减少雷电对充电桩的影响。浪涌保护器是一种用于限制瞬态过电压和泄放电涌电流的电子装置,它可以在雷

汽车电子相关术语

SOASOA(Service-OrientedArchitecture,面向服务的架构)是一种在计算机环境中设计、开发、部署和管理离散模型的方法。是由Garnter1996年提出的概念,将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,目的是为

.Net Core中Host的作用和用法

Host简介在ASP.NETCore中,Host是一个托管应用程序的宿主环境。它提供了一种统一的方式来启动和运行应用程序,无论是在开发环境中还是在生产环境中。Host负责处理应用程序的生命周期、配置和依赖项管理等任务,使开发人员能够专注于应用程序的业务逻辑。Host是通过使用IHostBuilder接口和Host.Cr

计算机竞赛 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录0前言1机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别2深度学习-人脸识别过程人脸检测人脸识别MetricLarning3最后0前言🔥优质竞赛项目系列,今天要分享的是🚩深度学习机器视觉人脸识别系统该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🥇学长这里给一个题目综合评分(每项满分5分)

计算机毕设 opencv python 深度学习垃圾图像分类系统

文章目录0前言课题简介一、识别效果二、实现1.数据集2.实现原理和方法3.网络结构最后0前言🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业

Anaconda和Pycharm详细安装 配置教程

Anaconda:是一个开源的Python发行版本,其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda下载】PyCharm:PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。【PyCharm下载】Anaconda的安装及环境配置一

热文推荐