当前位置: 首页 > news >正文

Linux项目自动化构建工具make/Makefile

  

本文已收录至《Linux知识与编程》专栏!
作者:ARMCSKGT
演示环境:CentOS 7 

   


目录

前言

正文 

makefile文件与语法规则

make指令与执行逻辑

makefile任务刷新策略

.PHONY修饰为伪目标

最后


前言

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的,规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建


正文 

makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译工具!


makefile文件与语法规则


make指令的执行是以makefile文件存在为基础的,如果没有makefile则make指令无法执行!

没有makefile文件make指令被迫停止

 makefile文件中写入任务,这些任务是由依赖关系+依赖方法构成和实现的!

依赖关系 = 目标对象 + 执行文件(执行对象)

依赖方法:处理执行对象产生目标对象的方法!


makefile语法格式:

目标对象:执行文件(执行文件) //依赖关系依赖方法(实现方法) //一般方法前面空格

 如图,exe可执行程序的产生依赖与test.c文件,而exe可执行程序的产生方法(也就是依赖方法)是利用gcc去编译并自定义名称为exe最终产生exe可执行程序,这样就完成了一个任务的构建,一个makefile文件中可以写很多任务

  

当然有些目标对象可能不需要执行文件这种半缺失的任务写法也是合理的,,例如我们自己写的clean清理任务,实现自动化清理产生的可执行程序exe同时也可以有多个执行文件(多个执行文件之间使用隔开),例如声明与定义分离时我们需要所有文件一起编译产生可执行程序

  

所以目标对象并不是一定会产生(或者说目标对象只是为了达成某种目的)可以说目标对象也是任务名!执行这个任务可能会产生对象,具体的看任务的目的和实现方法,而且产生的对象名也不一定和目标对象相同,也可以不同!这个可以依据个人喜好和公司规定进行设置!

  

这样每次我们修改完代码,就可以使用make指令进行exe程序的编译,测试完后立刻清除,在以后的项目编写中会有很多个任务,如果一句一句的通过指令执行效率太低,所以我们会经常使用到makefile提高效率!


make指令与执行逻辑


make调用makefile中的某一条任务指令:

make [目标对象]

make调用目标对象任务后会生成目标对象,并显示执行的方法(命令)!

 注意:如果我们执行make指令还没没有写目标对象,则make会默认执行makefile文件中第一个任务,后面的其他任务不会执行!只有我们使用make指令并指定任务的目标对象make才会执行指定的任务产生目标对象!


可能会有人想到说,makefile文件如果写成Makefile会有影响吗?两个都存在怎么办?

makefile和Makefile两个文件都可以被make指令识别和执行,当两个文件都存在时make会优先选择makefile文件去执行!


如果我们的make指令在执行方法,发现执行文件不存在时会在文件中向下在其他任务中去寻找,找到了则先执行对应任务获取自己所需要的执行文件,然后再执行本任务!其中的原理是依赖栈实现的,所以类似于函数调用,一层一层开辟栈帧。

 当然,在过程中产生的所需目标对象也会保留在目录中!

 makefile中依赖方法也不一定只能写一句,可以写多句,例如我们不需要预处理编译等文件,可以产生对象并使用后就立刻删除,而且所以这么多逻辑可以规整为一个依赖方法!


makefile任务刷新策略


在makefile中,如果目标任务的执行可以产生目标对象,则执行文件如果没有修改,再次执行make指令会报错,因为make会判断文件是否被修改(判断修改时间),如果被修改才允许更新目标对象!

 这时如果我们对源文件进行修改,或者touch一下修改源文件的修改时间就能再次使用make指令!


 .PHONY修饰为伪目标


.PHONY是makefile文件中的一个关键字,表示对某个目标对象产生伪目标,这样无论目标对象的执行文件是否被修改,都可以重复执行这个任务!

被.PHONY修饰的任务可以无视任务刷新策略,重复执行这个任务!

 

这个关键字一般用来修饰clean清理任务!我们每次生成可执行程序,再删除,重复执行是非常合理的;当然其他场景下如果需要也可以修饰!


最后

makefile的知识介绍到这里就结束了,相信了解完的朋友们一定有了很多套make任务列表来加速自己的开发;通过makefile极大的提高了我们的开发效率,是我们不可缺少的工具之一!

本次Linux编译器gcc/g++的基本知识就介绍到这里啦,希望能够尽可能帮助到大家。

如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!

 🌟其他文章阅读推荐🌟

Linux基础指令-CSDN博客

Linux权限的基本知识-CSDN博客

Linux编辑器vim-CSDN博客

🌹欢迎读者多多浏览多多支持!🌹

相关文章:

Linux项目自动化构建工具make/Makefile

本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 目录 前言 正文 makefile文件与语法规则 make指令与执行逻辑 makefile任务刷新策略 .PHONY修饰为伪目标 最后 前言 会不会写makefile,从一个侧面…...

M100嵌入式自动吞吐式读写器|电动读卡机如何通过C#程序读取社保卡号

M100嵌入式自动吞吐式读写器|电动读卡机是一款双保护门功能读卡器,第一层防尘防异物机械门,第二层电动门。 M100嵌入式自动吞吐式读写器|电动读卡机采用耐高温、耐磨擦、高强度、抗老化的复合型塑胶为主体,在走卡通道两侧镶有不锈钢金属&…...

STM32----搭建Arduino开发环境

搭建Arduino开发环境前言一、Arduino软件1.软件下载2.软件安装3.软件操作二、Cortex官方内核三、烧录下载四、其他第三方内核1.Libmaple内核2.Steve改进的LibMaple 内核3.STMicroelectronics(ST)公司编写的内核总结前言 本章介绍搭建STM32搭建Arduino开发环境,包括…...

华为OD机试 - 事件推送(Python),真机试题

事件推送 题目 同一个数轴 X 上有两个点的集合 A={A1, A2, …, Am} 和 B={B1, B2, …, Bn}, Ai 和 Bj 均为正整数,A、B 已经按照从小到大排好序,A、B 均不为空, 给定一个距离 R (正整数), 列出同时满足如下条件的所有(Ai, Bj)数对: Ai <= BjAi, Bj 之间的距离小于…...

论如何获取CSDN原力

0x00 前言 因为个人需求&#xff0c;所以需要增长原力值&#xff0c;故对原力值的增长方式进行探索和总结。 0x01 正文 参考&#xff1a;https://blog.csdn.net/SoftwareTeacher/article/details/114499372 1.举报了劣质内容&#xff08;博客&#xff0c;下载的资源&#x…...

流程引擎之发展史及对比总结

流程引擎渊源市场上比较有名的开源流程引擎有 jBPM、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四个框架同宗同源&#xff0c;祖先都是 jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。而 Compile…...

【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN-工具使用】

【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN】1、概述2、实验环境3、写在前面的一个问题4、实验准备&#xff08;1&#xff09;硬件连接1&#xff09;CAN卡连接开发板&#xff08;2&#xff09;逻辑分析仪连接开发板&#xff08;2) CAN卡连接软件&…...

C++中的模板

1.模板C 的模板一直是这门语言的一种特殊的艺术&#xff0c;模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理&#xff0c;仅在运行时处理那些最核心的动态服务&#xff0c;进而大幅优化运行期的性能。因此模板也被…...

Maven_第四章 使用Maven:IDEA环境

目录第一节 创建父工程第二节 配置Maven信息第三节 创建Java模块工程第四节 创建Web模块工程1、创建模块2、修改打包方式3、Web 设定4、借助IDEA生成web.xml5、设置 Web 资源的根目录6、测试6.1 创建文件6.2 配置tomcat第五节 其他操作1、在IDEA中执行Maven命令①直接执行②手动…...

RocketMQ基础学习

前言&#xff1a; RocketMQ阿里开源的&#xff0c;一款分布式的消息中间件&#xff0c;它经过阿里的生产环境的高并发、高吞吐的考验&#xff0c;同时&#xff0c;还支持分布式事务等场景。RocketMQ使用Java语言进行开发&#xff0c;方便Java开发者学习源码。但是&#xff0c;R…...

I.MX6ULL内核开发4:设备号的组成与哈希表

目录 一、设备号 二、hash table 一、设备号 文件夹&#xff1a;/home/geralt/linux_driver/kernel/ebf_linux_kernel_6ull_depth1/include/linux/kdev.h 这里面是linux中关于设备号的具体描述 #define MINORBITS 20 #define MINORMASK ((1U << MINORBITS) - 1)#defin…...

【博学谷学习记录】大数据课程-学习第六周总结

Hadoop 3.x的版本架构和模型介绍 由于Hadoop 2.0是基于JDK 1.7开发的&#xff0c;而JDK 1.7在2015年4月已停止更新&#xff0c;这直接迫使Hadoop社区基于JDK 1.8重新发布一个新的Hadoop版本&#xff0c;即hadoop 3.0。Hadoop 3.0中引入了一些重要的功能和优化&#xff0c;包括…...

Cordova

一、简介 Cordova 是用 Web 技术&#xff08; HTML&#xff0c;CSS 和 JS &#xff09;构建移动应用的平台。我们可以认为Cordova 是一个容器&#xff0c;用于将的 Web 应用移植到移动端&#xff0c;同时支持移动端的功能&#xff08;例如&#xff1a;定位、蓝牙、摄像头等&am…...

9.语义HTMLVScode扩展推荐

语义HTML 定义&#xff1a; 一个元素使用我们并不是只关心他是什么样子的&#xff0c;而是要去关心这个元素名称的实际意义或者代表什么 我们使用标签并不是他仅代表导航栏&#xff0c;只是将导航栏部分归为一个块。现实生活中&#xff0c;多使用之前都是使用div这个元素去构…...

一款非常不错的微信系统垃圾清理工具:微信清理大师,操作简单,清除较快。

微信清理大师 微信清理大师是一款专为微信所推出的系统垃圾清理工具。它的功能十分强大&#xff0c;可快捷清理微信内储存垃圾文件&#xff0c;操作十分简单&#xff0c;只需要轻轻一点&#xff0c;即可删除清理。 功能特点&#xff1a; 【一键清理】一键搞定无用垃圾&#x…...

PMP考前冲刺2.11 | 2023新征程,一举拿证

承载2023新一年的好运让我们迈向PMP终点一起冲刺&#xff01;一起拿证&#xff01;每日5道PMP习题助大家上岸PMP&#xff01;&#xff01;&#xff01;题目1-2&#xff1a;1.以下哪三种情况是Scrum主管应该注意的障碍&#xff1f;(选择三个)A. 阻碍敏捷能力的技术B. 缺乏团队授…...

yalc(比 yarn/npm link 更加友好的前端依赖库 link 方案)

参考链接: 【yalc 官方文档】:https://github.com/wclr/yalc 【yalc-watch 官方文档】:https://github.com/johot/yalc-watch 链接依赖库背景 以 D-SASS 前端框架为例,当我们在修改 D-SASS 前端框架时,当想着马上就要预览到修改的内容是否生效,于是在前端框架目录下进…...

Github | 个人资料自述文件配置的不完全总结

本文简单总结配置 Github 主页上个人资料自述文件的流程和参考文件。 更新&#xff1a;2022 / 02 / 11 Github | 配置个人主页的信息总览方法的不完全总结创建、删除个人资料自述文件编辑个人资料自述文件参考链接创建、删除个人资料自述文件 首推自然是官方说明文档 1&#…...

2022年12月电子学会Python等级考试试卷(二级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共2题&#xff0c;共30分) 青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 运行下列程序…...

SpringCloud第二讲 Ribbon负载均衡源码分析

前言介绍&#xff1a; 这一讲我们将依据Eureka的负载均衡规则&#xff0c;Eureka的具体服务搭建以及服务注册和服务发现可以参考基于Eureka实现服务注册和服务发现_热爱Java的编程小白的博客-CSDN博客 Eureka的服务搭建之后便可以在这上面进行服务注册&#xff0c;如果存在两个…...

Clip-path实现按钮流动边框动画

前言 &#x1f44f;Clip-path实现按钮流动边框动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 添加div标签 <div>苏苏_icon</div>添加样式 div {position: relative;width: 220px;height: 6…...

不停服更新应用的方案:蓝绿发布、滚动发布、灰度发布

原文网址&#xff1a;不停服更新应用的方案&#xff1a;蓝绿发布、滚动发布、灰度发布_IT利刃出鞘的博客-CSDN博客 简介 本文介绍不停服更新应用的方案&#xff1a;蓝绿发布、滚动发布、灰度发布。 升级服务器的应用时&#xff0c;要停止掉老版本服务&#xff0c;将程序上传…...

有趣的KaTeX(附源码)

两年半未见&#xff0c;甚是想念 给大家带来有趣的KaTeX\KaTeXKATE​X&#xff0c;可以放在洛谷主页 文章目录1234561 1#include<bits/stdc.h>\texttt{1 \color{orange}\#include <bits/stdc.h>}1 #include <bits/stdc.h> 2usingnamespacestd;\texttt{2 \col…...

Golang map笔记

map定义三种方式package mainimport "fmt"func main() {// map 的基本定义// 第一种方式 使用make分配数据空间var map1 map[string]stringmap1 make(map[string]string, 3)map1["no1"] "北京"map1["no2"] "天津"map1[&q…...

Android Jetpack组件之WorkManager高级概念介绍与使用(三)

一、介绍 通过前面两篇&#xff0c;我们基本掌握了组件的workmanager的接入&#xff0c;以及api的使用等。但是一个框架如果运用在复杂的项目中&#xff0c;肯定需要有其他额外的支持&#xff0c;介绍来我们将会介绍高级概念&#xff0c;以及对前面的知识点进行回顾与拓展。 高…...

Spring框架中用到的设计模式(都用到了哪些设计模式?)

文章目录简单工厂模式&#xff1a;工厂模式&#xff1a;单例模式&#xff1a;原型模式&#xff1a;迭代器模式&#xff1a;代理模式&#xff1a;适配器模式&#xff1a;观察者模式&#xff1a;模板模式&#xff1a;责任链模式&#xff1a;这是一道相对有难度的题目&#xff0c;…...

Python中的类和对象(4)

1. 构造函数 &#xff08;_ init _(self[,……])&#xff09; 在类中定义 _init _() 方法&#xff0c;可以实现在实例化对象的时候进行个性化定制&#xff1a; >>> class C: ... def __init__(self, x, y): ... self.x x ... self.y y ... …...

window11 安装node及配置环境变量

一、安装环境 本教程演示的环境&#xff1a; 系统&#xff1a;win 11 64位 node.js下载地址: http://nodejs.cn/ node.js版本&#xff1a;长期支持版本&#xff08;本教程基于16.15.0&#xff09; 点击选中图标下载到电脑本地即可。 二、安装步骤 1、双击安装包&#xff0c;一…...

腾讯云服务器选购新手教程(新版流程超级详细)

腾讯云服务器购买有两个入口&#xff0c;一个是直接在秒杀活动上购买云服务器&#xff0c;价格便宜&#xff0c;2核2G4M轻量服务器&#xff0c;2核4G6M服务器、4核8G10M服务器&#xff0c;活动上购买价格便宜&#xff0c;但是服务器机型固定&#xff1b;另一个是直接在云服务器…...

第四章 Opencv图像色彩空间与通道

文章目录1.色彩空间1-1.RGB/BGR色彩空间1-2.GRAY色彩空间1-3.HSV色彩空间2.通道2-1.拆分通道&#xff1a;split()方法1.拆BGR色彩空间图像的通道2.拆HSV色彩空间图像的通道2-2.合并通道&#xff1a;merge()方法1.B、G、R 通道的合并2.H、S、V 通道的合并3.B、G、R、A 通道的合并…...