【Linux】自动化构建工具makefile

news2024/9/20 0:54:33

目录

背景

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.coloradmin.cn/o/2073467.html

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

相关文章

MyBatis框架搭建与代码解读

前言: MyBatis是一个灵活的持久层框架&#xff0c;适合与数据库交互&#xff0c;支持自定义SQL和高级映射。搭建MyBatis的基本步骤包括&#xff1a; 环境准备&#xff1a;安装JDK、Maven和IDE。创建项目&#xff1a;建立Maven项目并设置基本信息。添加依赖&#xff1a;在pom.…

「Python数据分析」Pandas进阶,利用concat()函数连接数据(一)

在我们迈向中高级出局数据分析的过程中&#xff0c;数据的合并和连接&#xff0c;是一个非常重要的技能。 现实中&#xff0c;分散在各种数据库&#xff0c;各种数据表格&#xff0c;各种数据存储设备当中的&#xff0c;各式各样的数据&#xff0c;是我们进行数据分析的基础&a…

泛微开发修炼之旅--42Ecology大日志查看软件LogView Pro及教程

我们在项目上经常要看ecology的日志信息&#xff0c;当日志达到几百兆或者时几个G的时候&#xff0c;想要查看日志并且非常方便搜索日志中的信息&#xff0c;并不容易。 今天给大家大日志工具和教程&#xff0c;在附件中&#xff0c;各位自取吧&#xff01; 文章链接&#xff…

老师如何制作分班查询系统?

随着新学期的钟声敲响&#xff0c;老师们又迎来了一年中最忙碌的时期。不仅要处理日常的教学准备工作&#xff0c;还要面对一项重要而繁琐的任务——新生分班。分班完成后&#xff0c;老师们还需要将分班结果及时准确地通知给每一位家长&#xff0c;确保信息的传递无误。这项工…

epoll+线程池模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 负载均衡技术 …

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包&#xff0c;可以完成各种gpt辅助的工作&#xff0c;比如代码解读、翻译、读论文等功能。官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读…

Flutter 自动化测试 -appium-flutter-driver

上篇文章有讲述如何通过FlutterDriver实现集成测试Flutter 应用自动化测试-集成测试篇 不熟悉的小伙伴可以先去看看。 什么是Appium Flutter Driver&#xff1f; 作为Flutter开发&#xff0c;FlutterDriver是足够帮助他们进行测试的&#xff0c;而作为自动化测试工程师最大的困…

FFmpeg的入门实践系列五(编程入门之属性查看)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、AVFormatContext结构体1. 结构定义2. 字段说明3.示例1&#xff08;打开与关闭音视频文件&#xff0…

机器人学——机械臂轨迹规划-1

引言 理想轨迹 步骤-1 步骤-2 笛卡尔空间下的轨迹规划 步骤-1 步骤-2 三次多项式 矩阵形式求解 det(T): 行列式&#xff0c;非齐次多项式&#xff0c;结果不为零&#xff0c;有唯一解、行列式为零&#xff08;无穷解/无解&#xff0c;还需查看增广矩阵的秩&#xff09; 速度…

Linux网络编程:多路转接--select

1. 初识select 系统提供select函数来实现多路复用输入/输出模型. select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; 程序会停在select这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态改变 select只负责等待&#xff0c;可以等待多个fd&a…

内容创作者福音,4款文章改写神器轻松提升文章质量

在信息爆炸的时代&#xff0c;内容创作成为了连接世界的重要桥梁。作为一名专业创作者&#xff0c;我深知保持内容原创性和高质量的重要性。然而&#xff0c;灵感有时会枯竭&#xff0c;改写文章成为一项耗时且艰巨的任务。幸运的是&#xff0c;市面上有一些文章改写神器&#…

Flask+LayUI开发手记(四):弹出层实现增删改查功能

在上一节用dataTable实现数据列表时&#xff0c;已经加了表头工具栏和表内工具栏&#xff0c;栏内的按钮功能都是用来完成数据的增删改查了&#xff0c;这又分成两类功能&#xff0c;一类是删除或设置&#xff0c;这类功能简单&#xff0c;只需要选定记录&#xff0c;然后提交到…

Flutter 自动化测试 - 集成测试篇

Flutter集成测试 Flutter官方对Flutter应用测试类型做了三个阶段划分&#xff0c;分别为Unit&#xff08;单元&#xff09;测试、Widget&#xff08;组件&#xff09;测试、Integration&#xff08;集成&#xff09;测试。按照维护成本来看的话从左到右依次增高&#xff0c;按照…

预测癌症免疫治疗反应-TIDE数据库学习及知识整理

TIDE&#xff08;Tumor Immune Dysfunction and Exclusion&#xff09; 是一个用于预测癌症患者对免疫检查点抑制剂&#xff08;如PD-1/PD-L1抑制剂&#xff09;反应的算法。研究者通过检测肿瘤建模队列中每个基因的表达与效应性毒性T淋巴细胞(CTL)浸润水平的相互关系及对生存情…

Open3D 近似点体素滤波(36)

Open3D 近似点体素滤波(36) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 这个算法也是体素滤波, 它保留的点是近似点,也就是新的点,原始点云中对应位置是不存在这些点的。其他的看着类似,下面是代码,滤波抽稀结果 二、算法实现 1.代码 代码如下(示例): …

学习文件IO,让你从操作系统内核的角度去理解输入和输出(Java实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

【在Linux世界中追寻伟大的One Piece】应用层协议HTTP

目录 1 -> HTTP协议 2 -> 认识URL 2.1 -> urlencode和urldecode 3 -> HTTP协议请求与响应格式 3.1 -> HTTP请求 3.2 -> HTTP响应 4 -> HTTP的方法 4.1 -> HTTP常见方法 5 -> HTTP的状态码 6 -> HTTP常见Header 7 -> 最简单的HTTP服…

Linux系统报错“version ‘GLIBC_2.34‘ not found”解决方法

注意&#xff0c;此文章慎用&#xff0c;glibc不可随意升级&#xff0c;可能导致系统崩溃 一、查看版本 ldd --version 二、添加高版本源 sudo vi /etc/apt/sources.list.d/my.list 进入编辑页面 "i"键进入插入模式 输入源 deb http://th.archive.ubuntu.com/…

【信创】推荐一款超级好用的文件同步备份工具 _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【信创】统信UOS打包工具介绍与使用教程 Hello&#xff0c;大家好啊&#xff01;今天给大家推荐一款在Linux系统上超级好用的文件同步和备份工具——FreeFileSync。无论是在日常工作还是数据管理中&#xff0c;文件同步和备份都是至关重要的任务。FreeFile…

【自动驾驶】控制算法(五)连续方程离散化与离散LQR原理

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…