make工具的介绍,包含的显示/隐晦规则/变量定义/文件指示,使用,.PHONY的介绍+原理

news2024/11/26 10:05:20

目录

make--自动化构建工具

引入

介绍

包含 

显式规则

隐晦规则

变量定义

文件指示

注释

使用

test:test.c

.PHONY

介绍

作用

示例

原理 

示例

介绍


make--自动化构建工具

引入

  • 在软件开发过程中,通常需要编译、链接和构建大量的源代码文件
  • 如果全部由开发人员手动执行的话,太太太麻烦了
  • make可以自动化这些构建过程
  • 除了这个用处,make还有很多非常好的优点

介绍

  • make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建
  • makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 -- 也就是可以管理源代码文件之间的依赖关系
  • make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出 -- 也就是可以自动化构建过程
  • 支持模块化的构建,可以将复杂的项目分解为多个独立的模块,每个模块有自己的构建规则
  • 可以执行增量构建,只编译那些已更改的文件,而不是每次都重新编译整个项目

一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一种在工程方面的编译方法

包含 

makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系

makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释

显式规则

  • 显式规则定义了目标(target)文件如何由依赖文件(prerequisites)生成
  • 目标是要生成的文件
  • 依赖文件是生成目标所需的输入文件列表
  • 而配方(recipe)是执行生成目标所需的命令

隐晦规则

  • make有自动推导的功能
  • 所以隐晦的规则可以让我们不需要明确列出生成规则
  • 比如源文件与目标文件之间的时间关系判断之类(eg: .c文件生成.o文件)

变量定义

  • 在makefile中可以定义变量
  • 当makefile被执行时,其中的变量都会被扩展到相应的引用位置上
  • 通常使用 $(var) 表示引用变量

文件指示

  • 包括一些特殊的指令,配置make的行为
  • eg:.PHNOY指令用于声明伪目标

注释

  • 可以使用 # 在行首表示行注释
  • 用于提供有关规则、变量和文件的描述性信息

使用

默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件

例如,这是一个makefile文件

test:test.c

  • 表示我们需要生成的 test可执行文件 依赖于 test.c(也就是test的依赖关系)
  • 下一行紧跟着的就是他俩的依赖方法 -- test是由test.c使用gcc编译而来

.PHONY

介绍
  • .PHONY是一个特殊的目标名称,用于在Makefile中声明一个伪目标
  • 它不代表一个实际的文件名,而是用于定义一组命令或动作
作用

告诉make工具该目标"不依赖于文件的存在与否",每次执行都需要执行相应的命令

  • 通常,make工具会检查目标文件和依赖文件的时间戳来判断是否需要重新构建目标,,如果不需要它会提示你
  • 但是,有时候我们希望在没有实际文件依赖的情况下,也能执行一些操作或命令
示例
  • 当我们输入make clean时,它会直接执行我们写的clean依赖方法(由于clean不需要依赖什么文件,因此没有依赖对象)

构建好makefile文件以及内容后,直接输入make命令即可执行从上到下的第一个依赖关系

原理 

示例

实际上:简单的一句依赖方法,是需要生成多个依赖文件的

介绍

  • 它会不断寻找目标文件所需要的依赖文件,并且不断往前推进,直到找到源文件为止
  • 这样按照这个顺序,从源文件开始不断生成中间文件,最终就能得到我们的目标文件

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

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

相关文章

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称:guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击:build all 9、 右键之后,点击:Creat Boot Image 10、点击 Cr…

栈及其栈的模拟实现和使用

1. 栈(Stack) 1.1 概念 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原则…

【计算机网络】计算机网络中的基本概念

文章目录 局域网LAN基于网线直连基于集线器组建基于交换机组建基于交换机和路由器组建 广域网WANIP地址端口号协议为什么要有协议知名协议的默认端口 五元组协议分层TCP/IP五层模型封装和分用 网络互连就是将多台计算机连接在一起,完成数据共享。数据共享本质是网络…

echarts实现圆形进度图

echarts实现圆形进度图 效果图 话不多说,代码如下 option {title: {text: 本月功率因数,textStyle: {color: #666666,fontSize: 14},subtext: 0.95,subtextStyle: {color: #161616,fontSize:30,fontWeight:700},itemGap: 15, // 主副标题距离left: center,top:…

竞赛知识点11【线段树】

文章目录 一、概念二、基本操作2.1、建树2.2、区间询问操作2.3、单点修改2.4、区间修改一、概念 线段树是用一种树状结构来存储一个连续区间的信息的数据结构。 它主要用于处理一段连续区间的插入,查找,统计,查询等操作。 复杂度: 设区间长度是 n n n,所有操作的复杂度是 l…

Web渗透编程语言基础

Web渗透初学者JavaScript专栏汇总-CSDN博客 Web渗透Java初学者文章汇总-CSDN博客 一 Web渗透PHP语言基础 PHP 教程 | 菜鸟教程 (runoob.com) 一 PHP 语言的介绍 PHP是一种开源的服务器端脚本语言,它被广泛用于Web开发领域。PHP可以与HTML结合使用,创建动态网页。 PHP的特…

在Photoshop中如何校正倾斜的图片

在Photoshop中如何校正倾斜的图片呢?今天就教大家如何操作。 将需要操作的图片拉到PS软件中,自动形成项目。 点击上方“滤镜”中的“镜头校正”。 进入“镜头校正”窗口,点击左侧的“拉直工具”。文章源自设计学徒自学网-http://www.sx1c.co…

Shell module

案例 案例1概述 #!/bin/bash if [ -z "${NEXUS_ID}" ] || [ -z "${NEXUS_VERSION}" ]; thenecho "the length of NEXUS_ID or NEXUS_VERSION is zero"echo "NEXUS_ID: ${NEXUS_ID}"echo "NEXUS_VERSION: ${NEXUS_VERSION}"…

CentOS 搭建 Hadoop3 高可用集群

Hadoop FullyDistributed Mode 完全分布式 spark101spark102spark103192.168.171.101192.168.171.102192.168.171.103namenodenamenodejournalnodejournalnodejournalnodedatanodedatanodedatanodenodemanagernodemanagernodemanagerrecource managerrecource managerjob hist…

2. 网络之网络编程

网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法: 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…

USART HMI串口屏+GPS模块显示时间和经纬度

USART HMI串口屏GPS模块显示时间和经纬度 📍相关篇《基于u-box GPS模块通过串口指令调整输出信息》 📋在不使用其他单片机做数据中转处理情况下,利用USART HMI串口屏主动解析模式,来接收并解析GPS模块数据并显示,功能包…

Android 如何在Android studio中快速创建raw和assets文件夹

一 方案 1. 创建raw文件夹 切成project浏览模式——>找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有,直接在右侧输入框中出现的路径~\res后面加上\raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件&#xff0…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

【高光谱与多光谱:空间-光谱双优化模型驱动】

A Spatial–Spectral Dual-Optimization Model-Driven Deep Network for Hyperspectral and Multispectral Image Fusion (一种用于高光谱与多光谱图像融合的空间-光谱双优化模型驱动深度网络) 深度学习,特别是卷积神经网络(CNN…

【算法练习Day35】01背包问题分割等和子集

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 01背包问题分割等和子集总结…

C语言从入门到精通之【编译过程】

!!!本文内容毕业生面试必问哈。 编译过程 编译包含四个阶段,预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking&#x…

JAVA 实现PDF转图片(spire.pdf.free版)

1.引入jar包 导入方法1: 手动引入。将Free Spire.PDF for Java下载到本地,解压,找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序: 导入方法2:如果您想通过…

Day17力扣打卡

打卡记录 参加会议的最多员工数&#xff08;拓扑排序 分类讨论&#xff09; 链接 计算内向基环树的最大基环&#xff0c;基环树基环为2的情况分类讨论。 class Solution { public:int maximumInvitations(vector<int> &favorite) {int n favorite.size();vector…

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…

链表指定节点的插入

向现有链表中插入结点&#xff0c;根据插入位置的不同&#xff0c;可分为以下 3 种情况&#xff1a; 插入到链表的头部&#xff0c;作为新的链表中第一个存有数据的结点&#xff08;又称为”首元结点”&#xff09;&#xff1b;插入到链表中某两个结点之间的位置&#xff1b;插…