【Linux】自动化构建工具makefile

目录

背景

makefile简单编写

.PHONY

makefile中常用选项

makefile的自动推导

背景

        会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 ​

        ◉ 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 ​

        ◉ makefile带来的好处就是——”自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

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

         ◉ make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

makefile简单编写

makefile主要由两部分组成:a.依赖关系,b.依赖方法

首先我们创建并打开makefile文件

vim makefile

接着我们编写内容

 

Test1.c内容

                           

此时目录下有我们刚刚创建的文件,接着我们执行make命令

 

.PHONY

那如果我们想清理某个文件,该怎么写呢?既然是清理文件那还需要依赖什么文件删除吗?

这个时候需要用一个东西叫 .PHONY伪目标.

因为我们clean目的是清除某些文件,而删除操作又不会需要依赖文件,所以会创建一个伪目标,相当于依赖这个伪目标,然后执行依赖方法.

格式如下:

        1.先在前面写一个.PHONY:clean

        2.第二行紧接着输入clean:

        3.Tab键开头,然后输入依赖方法 rm -rf mytest

 

然后我们使用一下它,执行 make clean我们就会发现mytest被删除了

注意:如果我们不修改test1.cpp文件代码,持续make会发生如下情况:当前可执行程序已是最新版本

 

但是我们确可以一直执行make clean

原因就是.PHONY的作用

在makefile中如果我们想无限执行mytest,只需将.PHONY:目标文件 即可

 

无限执行mytest并不好,之前在未修改原文件,持续执行mytest会造成运行效率低下,一个文件未被修改,持续生称mytest给编译器造成无用的负担。但是可以无限执行clean,因为清理还是很有必要的。那么编译器是怎么知道我的可执行程序是最新的呢?--> 根据文件的最新修改时间

stat可以查看一个文件重要的三个时间

❍ Access:最近的访问时间.

❍ Modify: 最近的内容修改时间,比如你修改了文件的内容,这个时间就会改变.

❍ Change:最近的属性修改时间,比如你修改了这个文件的读写权限,这样它的属性修改时间就会被修改.

一个文件是由内容+属性组成,如果文件内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,并且可执行文件形成的时间一定比源文件晚(这是操作顺序的原因),所以只需要比较两者的时间,只要可执行文件的时间比源文件晚,就说明这个可执行文件一定是最新的

那么如果只执行make,它执行的是makefile中的哪一段语句呢?

默认执行的是第一个依赖关系和依赖方法

我们来验证一下这个道理:我们通过交换clean 与 mytest来验证

此时我们就可以使用make 执行clean了

 

makefile中常用选项

我们先编辑makefile中的内容

test.c内容

#include<stdio.h>
int mian(){printf("hello Wuxu\n");return 0;
}

makefile内容

 

测试输出:

 

说明:

1️⃣ makefile支持定义变量,这是一门解释性语言,无需像C语言那样 int a = 10;

2️⃣ $可以理解为取出对象$@ 是一个特殊变量,它代表当前规则的目标文件名;$^ 是一个特殊的宏,它代表当前规则的所有前置条件(即依赖文件列表)

3️⃣ 通过观察可知,echo是用来打印内容的,但是在这个echo中,$(src) $(bin)会被替换打印

4️⃣ 如果我们执行make/clean语句,不想打印出相关信息,可以在依赖方法前加@表明@:在命令前使用@可以阻止make打印这条命令

 此时只会打印echo语句执行的命令了

makefile的自动推导

我们先完整执行一下makefile

 

通过代码与执行语句我们可以发现make/makefile会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法

注意:

1️⃣ 语句第一条必须是最终结果,如果最终目标颠倒顺序,程序不可执行

2️⃣ 除了最终结果代码之外,其余的可以随意调换位置

3️⃣ 整个推导过程是递归的,与栈类似

 

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

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

相关文章

Scrapy 项目部署Scrapyd

什么是Scrapyd Scrapyd 是一个用来管理和运行 Scrapy 爬虫的服务。它允许用户将 Scrapy 项目部署到服务器上&#xff0c;然后通过一个简单的 API 来启动、停止和监控爬虫的运行。Scrapyd 可以帮助简化爬虫的部署过程&#xff0c;使得用户不必手动在服务器上运行爬虫&#xff0c…

【测试】JMeter从入门到进阶

本文参考 Jmeter自动化测试工具从入门到进阶6小时搞定&#xff0c;适合手工测试同学学习_哔哩哔哩_bilibili JMeter介绍 JMeter 是 Apache 组织使用 Java 开发的一款测试工具&#xff1a; 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序…

9个最流行的文本转语音引擎【TTS 2024】

在快速发展的技术世界中&#xff0c;文本转语音 (TTS) 引擎正在取得显著进步。从增强各种应用程序中的用户体验到创建逼真且引起情感共鸣的语音输出&#xff0c;TTS 引擎正变得不可或缺。在这里&#xff0c;我们介绍了 2024 年为行业树立新标准的九款最佳 TTS 引擎。 NSDT工具推…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”&#xff0c;本章是应用层常用且重要的协议htttp&#xff0c;没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Http协…

Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘

在使用Mac电脑的过程中&#xff0c;很多用户可能有需要扩展存储空间的需求。选择合适的移动硬盘格式对于数据传输的效率和兼容性至关重要。本文将详细介绍Mac移动硬盘选什么格式好&#xff0c;以及Mac怎么用ntfs移动硬盘&#xff0c;帮助用户优化Mac的使用体验。 一、Mac移动硬…

悬浮翻译工具有哪些?工作学习必备的5款悬浮翻译工具

当我们身处异国他乡&#xff0c;或是工作中遇到多语种交流的需求时&#xff0c;语言障碍往往会成为一道难以逾越的高墙。 不过&#xff0c;在这个充满创新的时代里&#xff0c;技术已经为我们准备好了答案——屏幕翻译器app。它们不仅能够即时翻译屏幕上的文字&#xff0c;还能…

电脑回收站清空了怎么恢复?

在日常使用电脑的过程中&#xff0c;不小心清空回收站导致重要文件丢失的情况时有发生。面对这种情况&#xff0c;我们不必过于慌张&#xff0c;因为有多种方法可以尝试恢复被清空的文件。本文将为您详细介绍几种有效的恢复方法&#xff0c;帮助您找回宝贵的文件。 方法一&…

芯片后端之 PT 使用 report_timing 产生报告 之 -nets 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -nets 选项 。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路径延时信息,仅仅显示…

Maven的一些相关知识【重修】《包括私服搭建!》

mvnrepository.com Maven 下载jar包的位置&#xff01; 【该部分有教程】 这是什么nb代码投稿视频-这是什么nb代码视频分享-哔哩哔哩视频 MAVEN 的私服搭建&#xff1a; https://zhuanlan.zhihu.com/p/520107316 2、maven私服搭建及应用&#xff08;下&#xff09;_哔哩…

R7RS标准之重要特性及用法实例(三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

frameworks 之InputReader

frameworks 之InputReader InputManagerService 初始化InputManagerService 启动InputReader 事件的读取设备节点注册和监听设备输入事件的读取 InputReader 事件的处理设备的添加和删除处理触摸事件的处理数据的加工和分发 android 输入事件 主要分 2个流程 事件读取 和 事件…

python的jieba库中文分词词频统计和合并

可能在设置问题模板的时候需要分析已有问句&#xff0c;然后统计词频&#xff0c;根据词频设计问题模板

31套科技风PPT免费分享

目录 部分展示 部分展示 #PPT下载 「科技风模板」链接&#xff1a;https://pan.quark.cn/s/fb2f39a1d343 链接永久有效&#xff0c;点击这里下载&#xff0c;记得给个赞哦

Java生成一个5位的随机验证码(大小写字母和数字)

生成验证码 内容&#xff1a;可以是小写字母&#xff0c;也可以是大写字母&#xff0c;还可以是数字 规则&#xff1a;长度为5 内容中四位字母&#xff0c;一位数字 其中数字只有一位&#xff0c;但是可以出现在任意位置。 package test;impo…

QT error: expected ‘:‘ before ‘slots‘ public slots:

C:\Users\Administrator\Desktop\VideoHill\GikISearch\net.h:10: error: expected : before slots public slots: 先看看头文件里有没有加上引用包含#include <xxxx> 也就是一个引用包含都没有 没有就会报这个。至少一个。 加上后

【架构-24】XML和JSON

XML&#xff08;可扩展标记语言&#xff09;和JSON&#xff08;JavaScript对象表示法&#xff09;是两种常用的数据格式&#xff0c;用于在不同系统之间传输和交换数据。它们各有优点和缺点&#xff0c;适用于不同的场景。下面是对XML和JSON的简要介绍以及它们之间的对比。 XM…

Chapter 01 Vue入门

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、Vue简介二、el:挂载点三、data&#xff1a;数据对象四、第一个Vue程序五、安装 Vue 开发者工具 前言 Vue 是一个框架&#xff0c;也是一个生态&#xff0c;其功能覆盖…

Modbus-TCP——Libmodbus安装和使用(Ubuntu22.04)

1、简介 Modbus是一种通信协议&#xff0c;广泛用于工业自动化和过程控制领域&#xff0c;允许不同设备之间进行数据交换。libmodbus是一个用于 Modbus 协议的开源库&#xff0c;主要用于开发和实现 Modbus 协议的客户端和服务器应用程序。libmodbus 以 C 语言编写&#xff0c…

【云原生】MySQL的源码编译

1、实验环境 &#xff08;1&#xff09;虚拟机版本&#xff1a;RHEL7.9 &#xff08;2&#xff09;主机 主机名称IP地址mysql-node1172.25.254.10mysql-node2172.25.254.20 2、实验步骤 注意&#xff1a;我们的两台主机都要进行MySQL源码编译&#xff0c;并且操作相同&…

探索 InternLM 模型能力边界

一、任务介绍 在 CompassArena 中选择双模型对话&#xff0c;与InternLM2.5及另外任意其他模型对话&#xff0c;收集 5 个 InternLM2.5 输出结果不如其他模型的对话案例&#xff0c;以及 InternLM2.5 的 5 个 Good Case。 任务地址&#xff1a;Docs Bad Case 1&#xff1a; 模…