Linux---make/makefile工具

目录

基本了解

makefile基础语法

依赖关系

依赖方法

makefile文件内容格式

make执行机制

补充知识

机制解释

PHONY关键字

makefile补充语法


基本了解

在Linux中,make/makefile是项目自动化构建工具。如果我们没有make/makefile,那我们要编译一个文件,只能使用gcc/g++指令来进行编译,但是我们有了make/makefile之后,就可以使用make指令来自动编译,不用输gcc/g++指令。尤其是多文件的时候,一个make指令直接搞定。

make是一个指令,makefile是一个文件。

makefile/Makefile文件名都可以,需要我们自己手动创建。

浅看一下

makefile基础语法

make指令只认makefile文件。

makefile文件里写的是依赖关系和依赖方法。

依赖关系

依赖关系是表明为什么,即确定一个关系的链接。

依赖方法

依赖方法是被依赖者应该怎么做,是解决问题的一种具体的方法。

makefile文件内容格式

使用make指令时,make默认时从上到下扫描makefile文件的,默认执行的是第一组依赖关系和依赖方法。

举个例子

但是,我们执行多次make指令时,会发现一个问题。

关于这个问题,是make/makefile执行机制的问题

make执行机制

补充知识

一般来说,一个文件/目录都是有它的ACM时间的。这里补充一点,Access Time不是根据每次访问时间来刷新的,而是根据某种规则刷新的。

具体原因如下:Linux在被使用的过程中,访问一个文件/目录的频率是比较高的,但是每次访问都修改Access Time有点浪费效率,所以,Linux就设置特殊规则来控制Access Time的刷新。

机制解释

 一个源文件(test.c文件)和可执行程序(mybin)的文件最经一次修改时间是不一致的。

即肯定需要先修改源文件,然后在编译链接形成对应的可执行程序。所以一定是先修改的源文件,再形成的可执行程序。

make指令可以可以通过比较可执行程序和源文件的最近一次修改时间(这里的时间是Modify Time)来确定是否需要再次执行指令。

为什么要这样做呢???

一般来说,源文件与可执行程序的时间先后分为两种:

1、可执行程序在前,源文件在后

 对于这种情况,源文件一定是做了修改的,是最新的,而可执行程序是旧的,还是上个源文件的版本形成的可执行程序。所以这种情况下的make指令,需要被执行。

2、源文件在前,可执行程序在后

 对于这种情况,可执行程序是新的,就是最新的源文件形成的可执行程序。所以此时make指令就不需要被执行,执行了也是白执行。

总结一下:make指令通过比较时间来知道可执行程序是新的还是旧的。可执行程序如果是新的,make指令就不执行。可执行程序如果是旧的,make就需要被执行。

注意:这里比较的时间是Modify Time,因为修改源文件一定修改的是源文件的内容。

但是,我们在已有指定文件的目录下,再去创建这个文件,就会刷新这个文件的ACM时间。

 这样的话,就又可以执行make指令了。

PHONY关键字

那么我如果就想make一个目标,并且要求这个目标每次都被执行,每次都不走make的机制,总不可能一直刷新ACM时间吧,这有点离谱哈哈哈。

所以,make/makefile为我们提供了一个关键字PHONY。

被PHONY修饰的目标称为伪目标,伪目标总是被执行。

一般将clean设置为伪目标。

原因在于如果将编译链接目标设置为伪目标的话,每次都需要重新编译链接,大大降低了编译效率,若按照make的机制,则可以节省性能资源和提高效率。

makefile补充语法

1、#表示注释,相当于C/C++中的//

2、$@表示目标文件

3、$^表示依赖文件

4、makefile再开始写的时候也可以定义变量,相当于一种宏替换。

最后,如有不足,请各位大佬多多指教!!!

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

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

相关文章

基于Java的模拟写字板的设计与实现

点击下载链接 基于Java的模拟写字板的设计与实现 摘要:目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首…

Linux系统编程——生产者消费者模型

目录 一,模型介绍 1.1 预备知识(超市买东西的例子) 1.2 模型介绍 1.3 CP模型特点 二,基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三,POSIX信号量 3.1 信号量原理 3…

一篇文章带你学完Java所有的时间与日期类

目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣(LeetCode) 定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针和快指针都在位置 head,这样一来,如果在移动的过程中&#x…

05。拿捏ArkTS 第 3 天 --- 对象、联合类型、枚举

1,什么是对象?对象是干什么的? ~用来存储不同类型数据的容器 ~用来描述物体的特征和行为 //特征就是属性,行为就是方法(对象内的函数) 2,对象的基本样式是? …

Noah-MP陆面生态水文模拟与多源遥感数据同化技术

了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用;熟悉模型的发展历程,常见模型及各自特点;理解Noah-MP模型的原理,掌握Noah-MP模型在单站和区域的模拟、模拟结果的输出和后续分析及可视化等方法;…

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每…

JQuery 弹幕可上下左右

水平弹幕,可设置向左、向右 containerId为显示弹幕容器ID, message弹幕内容, direction弹幕移动方向 // Jquery指定容器 向左或向右弹幕function sendBarrage_horizontal(containerId, message, direction) {// 第1部分,设置并挂载元素// 定义弹幕元素&#xff0c…

23.jdk源码阅读之Thread(下)

1. 写在前面 上篇文章我们介绍了Tread的一些方法的底层代码实现&#xff0c;这篇文章我们继续。 2. join()方法的底层实现 /*** Waits at most {code millis} milliseconds for this thread to* die. A timeout of {code 0} means to wait forever.** <p> This impleme…

【java】【springboot】启动方法注解详解

在Spring Boot中&#xff0c;启动方法通常是main方法&#xff0c;它位于应用程序的主类中&#xff0c;负责启动Spring应用上下文。 一、SpringBootApplication SpringBootApplication 是 Spring Boot 中一个非常核心的注解&#xff0c;它是一个复合注解&#xff0c;包含了三个…

从工艺到性能:模具3D打印材料不断革新

在模具3D打印领域&#xff0c;材料性能的持续优化与创新是推动模具3D打印的关键因素&#xff0c;近年来&#xff0c;各种3D打印新材料不断涌现&#xff0c;模具3D打印材料也开始重工艺导向逐步向性能导向发展&#xff0c;如毅速公司推出的ESU-EM191/191S及ESU-EM201不锈钢粉末、…

电脑文件误删除如何恢复?数据恢复第一步是什么?这五点要第一时间处理!

电脑文件误删除如何恢复&#xff1f;数据删除恢复的第一时间要做什么&#xff0c;你知道吗&#xff1f; 在使用电脑的过程中&#xff0c;误删除重要文件的情况时有发生。面对这种情况&#xff0c;不必过于慌张&#xff0c;因为有多种方法可以帮助你恢复误删除的文件。以下是恢复…

网络通信---UDP

前两天做了个mplayer项目&#xff0c;今日继续学习 网络内容十分重要&#xff01;&#xff01;&#xff01; 1.OSI七层模型 应用层:要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等&#xff08;最接近用户&#xff0c;看传输的内容类型到底是什么&#xff09; …

香橙派orangepi系统没有apt,也没有apt-get,也没有yum命令,找不到apt、apt-get、yum的Linux系统

以下是一个关于如何在 Orange Pi 上的 Arch Linux 系统中发现缺失包管理器的问题并解决的详细教程。 发现问题 确认系统类型&#xff1a; 使用以下命令检查当前的 Linux 发行版&#xff1a; uname -a cat /etc/os-release如果你看到类似于 “Arch Linux” 的信息&#xff0c;说…

【数据结构与算法】顺序表

顺序表 一.顺序表的原理1.是什么2.数据结构 二.顺序表的初始化三.顺序表增加元素四.顺序表插入元素五.顺序表删除元素六.顺序表的销毁七.总结 一.顺序表的原理 1.是什么 顺序表是一种线性的结构,类似于数组,但是中间不能有空值. 元素顺序地存储在一段连续的内存空间中. 顺序表…

单关节电机动力学辨识

这是一个单关节电机的动力学辨识过程&#xff0c;这是一个yaw轴转动电机的动力学辨识过程 1、动力学建模 &#xff08;1&#xff09;整体动力学 F J α f F J\alpha f FJαf 单关节的物理量包括惯性项、离心力和科氏力、摩擦力。这里忽略离心力和科氏力&#xff0c;据说…

SolidEdge二次开发(C#)-环境配置

文章目录 1、前言2、环境配置2.1 安装Solidworks20242.2 安装VS20222.3 查看Com组件2.3.1 在VS2022中创建一个wpf工程项目2.3.2 添加com组件 1、前言 SolidEdge是Siemens PLM Software公司旗下的三维CAD软件&#xff0c;采用Siemens PLM Software公司自己拥有专利的Parasolid作…

使用Java和Spring Retry实现重试机制

使用Java和Spring Retry实现重试机制 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Java中使用Spring Retry来实现重试机制。重试机制在处理临时性故障和提高系统稳…

Pandas筛选数据的10种方法

Pandas是Python中用于数据操作和分析的强大库之一.它提供了丰富的功能来处理和筛选数据.本文将介绍Pandas中筛选数据的10种常用方法,并通过示例展示具体操作步骤. 1. 基于条件筛选 Pandas支持通过布尔索引根据条件筛选数据.这是最常用的筛选方法之一. import pandas as pd# …