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

1175ee7859cc48aea62cd5d09ac60a8a.png

 前言

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

欢迎订阅 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目录下)

  •  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自上而下查找】


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

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


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

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

结论:

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

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

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

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

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


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

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

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

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

相关文章

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络(Recurrent Neural Network,RNN)是一种深度学习模型,主要用于处理序列数据,如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构,允许…

7.21一日总结

1.redux中action传参 a.传参 在时间中,第二个参数就是传递的值,num就是传递的参数 onClick{()>{store.dispatch({type:del,num:1})}} b.接收参数 const reducer function (state { ...data }, action) {switch (action.type) {case "del":console.log(action.n…

什么是剪贴板劫持-剪贴板劫持教程

目录 前言 什么是剪贴板劫持如何避免剪贴板劫持?如何执行剪贴板劫持? 总结 前言 我来写剪贴板劫持教程。 什么是剪贴板劫持 剪贴板劫持是一种危险的攻击技术,借助该攻击者可以控制受害者的剪贴板并将恶意代码粘贴到目标机器中,…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统;液晶显示当前信息和状态;通过语音识别模块对当前垃圾种类进行语音识别; 通过蜂鸣器进行声光报警提醒垃圾桶已满;采用舵机控制垃圾桶打开关闭;超声波检测当前垃圾桶满溢程度&#xff1…

认识spring项目的创建 和 从spring中进行Bean对象的存取

前言 本篇简单介绍如何创建spring项目,如何存储到spring容器中,如何从容器中获取Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1. 创建spring项目2. 将Bean对象存…

RS485/RS232自由转ETHERNET/IP网关rs485和232接口一样吗

你是否曾经遇到过这样的问题:如何将ETHERNET/IP网络和RS485/RS232总线连接起来呢? 远创智控的YC-EIP-RS485/232通讯网关,自主研发的ETHERNET/IP从站功能,完美解决了这个难题。这款网关不仅可以将ETHERNET/IP网络和RS485/RS232总线…

服务器数据恢复-ESX SERVER无法连接到STORAGE的数据恢复案例

服务器数据恢复环境: 某公司信息管理平台,数台VMware ESX SERVER虚拟机共享一台IBM某型号存储。 服务器故障: VC报告虚拟磁盘丢失,管理员ssh到ESX中执行fdisk -l命令查看磁盘,发现STORAGE已经没有分区表了。重启设备后…

WAIC2023:图像内容安全黑科技助力可信AI发展

目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束,恰逢全球大模型和生成式人工智能蓬勃兴起之时,今年参…

C++第五讲

思维导图 续&#xff1a;myString类完善 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/19 19:20.--------------------------------- */ #include<iostream> #include<cstring>using namespace std;class myString { priva…

社区发现相关算法

目录 **社区检测与聚类****社区检测技术**1. Louvain 社区检测[2]2. Surprise社区检测[3]3. 莱顿社区检测[4]4. Walktrap 社区检测[5] 结论5.LPA 标签传播6.K-L算法7.GN算法8.Newman快速算法 SlashBurn: Graph Compression and Mining beyond Caveman CommunitiesReferences 摘…

WebSocket笔记

1. websocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接W…

【微信小程序】分别对确认和取消按钮设置不同的样式,添加自定义的样式类

给确认和取消按钮设置不同的微信小程序样式&#xff0c;你可以使用<button>标签的class属性来添加自定义的样式类&#xff0c;并在对应的样式类中定义不同的样式。 以下是一个示例代码&#xff0c;演示如何给确认按钮和取消按钮设置不同的样式&#xff1a; <button …

【EXCEL】通过url获取网页表格数据

目录 0.环境 1.背景 2.具体操作 0.环境 windows excel2021 1.背景 之前我用python的flask框架的爬虫爬取过豆瓣网的电影信息&#xff0c;没想到excel可以直接通过url去获取网页表格内的信息&#xff0c;比如下图这是电影信息界面 即将上映电影 (douban.com) 通过excel操作&…

GO学习之切片操作

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 文章目录 GO系列前言一、什么是切片&#xff08;和数组有什么关系&#xff09;二、切片基本操作2.1 切片定义2.2 添加元素2.3 删除元素2.4 遍历2.5 自定…

商品信息管理-亿发商品进销存管理系统,批发行业零售门店免费试用

众所周知&#xff0c;批发零售行业面临着商品品类繁多、品牌众多、商品信息量庞大等挑战。同时&#xff0c;商品售价波动频繁&#xff0c;还需要管理商品批次&#xff0c;避免积压过期。针对这些传统批发零售行业的管理难题&#xff0c;加快行业数字化转型成为解决之道&#xf…

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有…

目标检测——FasterRCNN原理与实现

目录 网络工作流程数据加载模型加载模型预测过程RPN获取候选区域FastRCNN进行目标检测 模型结构详解backboneRPN网络anchorsRPN分类RPN回归Proposal层 ROIPooling目标分类与回归 FasterRCNN的训练RPN网络的训练正负样本标记RPN网络的损失函数训练过程实现正负样本设置损失函数 …

Apache Doris (三十):Doris 数据导入(八)Spark Load 3- 导入HDFS数据

目录 1. 准备HDFS数据 2. 创建Doris表 3. 创建Spark Load导入任务 4. 查看导入任务状态 进入正文之前&#xff0c;欢迎订阅专题、对博文点赞、评论、收藏&#xff0c;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; 宝子们订阅、点赞、收藏不迷路&#xff01;抓紧…

echarts实现渐变折线图并添加点击事件

折线图点击事件代码: let myChart = this.$echarts.init(document.getElementById(trendBoxECharts))myChart.getZr().on(click, params => {console.log(params)let pointInPixel = [params.offsetX, params.offsetY]if (myChart.containPixel(grid, pointInPixel)) {//点…

【JAVA】云HIS系统功能菜单知识(一)

一、云HIS特色 云HIS滚动消息栏&#xff1a;质控消息、住院时长、药库结转、患者入院、医嘱停止、新开医嘱、门诊用药不良、出院审核、药品调拨、排班提醒、药品库存、药品过期、药品临期等帮助医生、护士和相关管理人员实时接收院内消息并作出处理。 二、云HIS功能菜单 【预约…