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…

力扣 快慢指针

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)。通过为每…

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…

从工艺到性能:模具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; …

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

顺序表 一.顺序表的原理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作…

js动画插件-vue

分享一个动画插件 学习 动画插件 是进入大厂的必备技能 首先我们需要先学会 去使用js 动画 封装好的 GreenSock 动画平台 &#xff08;GSAP&#xff09; greensock.com/gsap/ 就是这个插件 我现在分享一个用例 其实很简单 但是 具体的属性 和很多 内容需要慢慢使用 慢慢看…

C++客户端Qt开发——系统相关(文件操作)

2.文件操作 ①输入输出设备类 在Qt中&#xff0c;文件读写的类为QFile。QFile的父类为QFileDevice,QFileDevice提供了文件交互操作的底层功能。QFileDevice的父类是QIODevice,QIODevice的父类为QObject。 QIODevice是Qt中所有输入输出设备(input/output device,简称I/O设备)…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 环形字符串最长子串(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

【React】useState:状态管理的基石

文章目录 一、什么是 useState&#xff1f;二、useState 的基本用法三、useState 的工作原理四、高级用法五、最佳实践 在现代前端开发中&#xff0c;React 是一个非常流行的库&#xff0c;而 useState 是 React 中最重要的 Hook 之一。useState 使得函数组件能够拥有自己的状态…

深入理解synchronized(简记)

深入理解synchronized 管程synchronized对象的内存布局锁状态记录锁对象状态转换偏向锁轻量级锁锁对象转换总结 管程synchronized Java 参考了 MESA 模型&#xff0c;语言内置的管程&#xff08;synchronized&#xff09;对 MESA 模型进行了精简。 对象的内存布局 对象头 Mar…

Nginx笔记(一)

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 [13]&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.…