Linux项目自动化构建工具-make/makefile 介绍及使用

使用背景

在工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义一系列
规则来指定什么文件需要先编译,什么文件需要后编译,哪些文件需要重新编译,或者更复杂
的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,提高效率
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE也都有这个命
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
而 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

make/makefile的原理及简单例子

make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。 如果找到,它会找文件中的第一个目标文件,并把这个文件作为最终的目标文件。
那我们来举个例子
以图片内的代码为例
将myfile.c文件内写好代码
在这里插入图片描述
先创建Makefile文件,这里makefile和Makefile都可以
在这里插入图片描述

在Makefile中写入如下代码,那么我们就会问 myfile:myfile.c是什么意思?
myfile与myfile.c为依赖关系
而下面 gcc -o myfile myfile.c为依赖方法,我们解释下,我们想形成myfile可执行那么我们要依赖myfile.c文件,如何依赖就需要依赖方法来将myfile与myfile.c进行相关操作。也就是需要依赖关系依赖方法来形成可执行程序。

在这里插入图片描述
然后我们make以下就形成了myfile可执行程序,图中绿字可见。在./myfile 形成 。屏幕上打印处hello
在这里插入图片描述

那么在工程中有些是需要进行清理的,如果每次都手动清理第一是不方便,第二也有可能误操作,因此我们可以在Makefile中添加清理的操作。而清理需要总需要被执行的,因此用**.PHONY来修饰。下面对.PHONY**有相关解释
在这里插入图片描述

可以看到在输入make clean命令后执行了 rm -f myfile的命令查看结果myfile被清理掉了。
在这里插入图片描述
注意:
在写依赖方法时前面需要TAB一下空格
在这里插入图片描述

.PHONY

.PHONY来修饰clean,而**.PHONY的作用为设置为伪目标,伪目标的特性是总是被执行的。
为了方便大家理解我们来看这个例子
在这里插入图片描述
图中我们多次
make**,但是除了第一次形成可执行外第二次三次都没形成可执行,这样为不是总是被执行,如果我们将myfile设置成总是被执行,是否可以多次形成。
在这里插入图片描述
在设置给myfile设置**.PHONY后,可以看到make可以多次形成
在这里插入图片描述
一般自己形成的可执行不用
.PHONY**去修饰,大量代码的编译需要大量时间, make在执行makefile规则中,根据语法规则,会分析目标对象与依赖对象的时间信息,判断是否在上一次生成后,源文件发生了修改,修改后的源文件比可执行的时间要晚,make判断发生了修改需要重新生成,因此一般只需要让修改过后的重新编。在这里插入代码片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸,但是x轴数据反了三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …

在 Python 中将字符串转换为集合

使用 set() 类将字符串转换为集合,例如 my_set set(my_str)。 set() 类将通过拆分其字符将字符串转换为集合。 my_str one# ✅ 通过拆分字符将字符串转换为集合 my_set set(my_str) print(my_set) # 👉️ {n, o, e}# -----------------------------…

Vector - CAPL - 实时时间on *(续2)

继续继续。。。四、键盘事件这个键盘事件是我个人起的名字,为了方便与其他事件进行区分,为什么要把这一个单独拉出来说呢,因为它的用处实在是太广泛了,基本只要是使用CANoe做一些基本的自动化测试小工具,都会用到它&am…

淘宝天猫价格监控接入方案

电商市场的兴起,让很多人看到了电商发展的前景,纷纷开始涉足电商。但由于门槛低、利润高,一些卖家开始打起了低价促销的主意。很多品牌方在面对这些现象时都非常苦恼,随着这类乱价现象的逐年加剧,许多品牌厂商都选择做…

面试热点题:回溯算法 递增子序列与全排列 II

前言: 如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门,让你快速了解回溯算法的基本原理及框架 递增子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两…

Linux系统之安装PostgreSQL数据库

Linux系统之安装PostgreSQL数据库一、PostgreSQL介绍1.PostgreSQL简介2.PostgreSQL特点二、本次实践介绍1.本次实践介绍2.实践环境介绍三、配置PostgreSQL的yum仓库源1.检查本地是否部署PostgreSQL2.配置镜像源3.检查yum仓库镜像源状态四、安装PostgreSQL1.安装PostgreSQL2.初始…

我的第一台电脑的故事

第一台电脑啊,多么遥远的故事了,又似乎就在眼前。今天重回往事,就简单记录一下吧。 🌱缘起 那是初一,至今已13年,遂觉遥远,而又是立志我学习的起点,至今还在校园,又觉就…

亚马逊、eBay、速卖通等跨境电商自养号测评,你知道多少?

自养号测评对跨境电商来说已经司空见惯,现在绝大部分卖家都有对店铺产品进行测评,虽然平台和消费者对测评补单很反感,但是在人人都测评的大环境的影响下不测评就意味着要被淘汰。 之前在一些论坛看到有博主分享自己对于广告和数据化的理解&a…

CCF-CSP认证 202303 500分题解

202303-1 田地丈量&#xff08;矩阵面积交&#xff09; 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度&#xff0c;相交的时候是min右端点-max左端点&#xff0c;不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…

java八股文--数据库

数据库1.索引的基本原理2.聚簇和非聚簇索引的区别3.mysql索引的数据结构以及各自的优劣4.索引的设计原则5.事务的基本特性和隔离级别6.mysql主从同步原理7.简述MyISAM和InnoDB的区别8.简述mysql中索引类型及对数据库性能的影响9.Explain语句结果中各个字段分别表示什么10.索引覆…

第十四届蓝桥杯三月真题刷题训练——第 24 天

目录 第 1 题&#xff1a;旋转 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;附近最小_单调队列模板 代码&#xff1a; 第 3 题&#xff1a;扫地机器人_二分 题目描述 输入描述 输出描述 输入输出样…

vue 项目中使用高德地图

一、账号准备 首先&#xff0c;需要注册并登录高德地图开放平台&#xff0c;申请密钥。操作指引&#xff1a;高德地图开放平台 二、安装高德地图加载器 npm 安装&#xff1a; npm i amap/amap-jsapi-loader --save或者 yarn 安装&#xff1a; yarn add amap/amap-jsapi-loa…

Kotlin语法-Day6

文章目录1.1 定义类和field关键字1.2 主构造函数1.3 次构造函数1.4 初始化代码块1.5 延迟初始化lateinit1.6 惰性初始化by lazy1.6.1普通方式1.6.2 by lazy方式1.7 类的继承与重载1.8 类型转换1.1 定义类和field关键字 //TODO Kotlin语言中的定义类和field关键字学习 /* * * *…

一款全新的基于GPT4的Python神器,关键还免费

chartgpt大火之后&#xff0c;随之而来的就是一大类衍生物了。 然后&#xff0c;今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费&#xff0c;我们可以直接利用它来辅助我们编程&#xff0c;真正做到事半功倍。 注意&#…

ython和PyTorch实现ChatGPT批量AI智能写作

怎么实现用chatgpt批量写作 ChatGPT是一种针对文本生成的自然语言处理工具&#xff0c;它可以用于生成大量的文本内容。但是&#xff0c;由于ChatGPT需要的计算资源较大&#xff0c;处理时间较长&#xff0c;因此在批量写作时需要考虑花费的时间和资源。 以下是一些步骤&…

【ArcGIS Pro二次开发】(18):地理处理工具类【Geoprocessing】补遗

ArcGIS Pro SDK 3.0中的Geoprocessing类是用于执行地理处理工具的核心类。地理处理工具是用于执行空间分析、数据转换、数据管理等任务的工具集&#xff0c;包括常见的空间分析工具、栅格处理工具、矢量处理工具、地图制图工具等。 之前有简单记录了下Geoprocessing工具的用法…

Python实现人脸识别,进行视频跟踪打码,羞羞的画面统统打上马赛克

哈喽兄弟们&#xff0c;我是轻松~ 今天我们来实现用Python自动对视频打马赛克前言准备工作代码实战效果展示最后前言 事情是这样的&#xff0c;昨天去表弟家&#xff0c;用了下他的电脑&#xff0c;不小心点到了他硬盘里隐藏的秘密&#xff0c;本来我只需要用几分钟电脑的&…

HAProxy集群与常见的Web集群软件调度器对比

目录 一.常见的Web集群调度器 二.HAProxy基本介绍 1.HAProxy是什么&#xff1f; 2.HAProxy的特性 3.HAProxy常用的8种负载均衡调度算法 3.1 轮询&#xff1a;RR&#xff08;Round Robin&#xff09; 3.2 最小连接数&#xff1a;LC&#xff08;Least Connections&#xf…

TypeScript(八)装饰器

目录 前言 定义 类装饰器 基本用法 操作方式 操作类的原型 类继承操作 方法装饰器 属性装饰器 存取器装饰器 参数装饰器 基本用法 参数过滤器 元数据函数实现 参数过滤 效果实践 装饰器优先级 相同装饰器 不同装饰器 装饰器工厂 hooks与class兼容 结语 …

PMP考试备考:你不知道的8个常考概念

PMP考试即将到来&#xff0c;为便于广大考生在考试前查漏补缺&#xff0c;给大家准备了PMP考试中常考的八个重要概念&#xff0c;包括敏感性分析、德尔菲技术等&#xff0c;快来看看吧。 01敏感性分析 敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它有助于理解项…
最新文章