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

news2024/11/24 20:49:46

文章目录

  • 1.make/Makefile的重要性
  • 2.规则及使用
    • 使用
    • 规则
  • 3.Makefile编译多文件


1.make/Makefile的重要性

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

2.规则及使用

使用

我们先来看一下make/Makefile在Linux中的简单使用(先看看猪跑,接着会解析规则):

第一步:我们先创建一个myfile.c文件,写入简单的内容
在这里插入图片描述
在这里插入图片描述

第二步:创建一个Makefile文件,写入符合Makefile规则的内容
在这里插入图片描述
在这里插入图片描述

第三步:使用make命令,生成可执行程序,使用make clean删除可执行程序
在这里插入图片描述

规则

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

在这里插入图片描述

1.依赖关系:在这个程序中,myfile可执行程序和myfile.c文件构成依赖关系,myfile.c的改变会影响myfile,所以myfile依赖于myfile.c。所以第一行就表示myfile可执行程序的生成依赖于myfile.c文件。

2.依赖方法:myfile可执行程序的生成依赖于myfile.c,gcc myfile.c -o myfile就是myfile文件依赖myfile.c的依赖方法。
(注意:完成一件事必须要有正确的依赖关系+正确的依赖方法。)

3.PHONY:被该关键字修饰的对象是一个伪目标,即该目标可以总是被执行(不需要进行时间新旧的比较),即如果我们希望多次生成一样的可执行程序,就可以用这个关键字修饰对象,不过我们一般不这样操作。大家肯定会有疑问:“啊?总是被执行是什么意思?”

我们接下来以这个Makefile文件为例,myfile.c文件的内容还是不变的。
在这里插入图片描述
make原理:这段代码,充分体现了依赖关系与依赖方法:make会在当前目录下找名字为“Makefile”或“makefile”的文件,然后找到第一个依赖关系,myfile的生成依赖于myfile.o,myfile.o的生成依赖于myfile.s,myfile.s的生成依赖于myfile.i,myfile.i的生成依赖于myfile.c,然后gcc的内容分别是它们的依赖方法。然后clean就是清理,当我们在命令行输入make clean,就会执行rm -f myfile myfile.i myfile.o myfile.s这句指令,就可以直接删除这些文件了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

项目清理:工程是需要被清理的。像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

在这里插入图片描述
在这里插入图片描述

这段代码第一次执行make,可以正常执行,然鹅,我们第二次在命令行输入make,就无法再次被执行了。然鹅,大家看上图make clean被执行一次生效之后,我们再执行一次,还是可以生效。那么这就是.PHONY的作用,也就是“总是被执行”的意思。如果大家希望make指令可以总是被执行,那么就在开头加上.PHONY。那么在不加.PHONY,gcc是怎么知道我们不需要再编译了呢?

方法:如果我们make之后,又对源文件进行修改,则我们还可以再执行make指令(即编译器会判断myfile.c的modify时间是否早于myfile可执行程序,如果晚于myfile,则说明myfile.c文件发生修改,make可以继续执行,生成新的程序,覆盖旧的程序)。

注意make是一条命令,makefile是一个文件(在当前源代码的路径下),两个搭配使用,完成项目自动化构建。make指令默认执行Makefile文件中第一个依赖方法。如果你想运行指定的程序,就要显示定义,例如上述的make clean。

例如我们将Makefile文件改成如下代码并wq退出,在命令行输入make指令,就会先执行rm指令。
在这里插入图片描述
在这里插入图片描述

3.Makefile编译多文件

当我们的工程中有多个源文件的时候,我们要如何进行编译?
在这里插入图片描述

在这里插入图片描述
首先,我们可以直接使用gcc指令对多个源文件进行编译,进而生成可执行程序。注意用这种方式编译文件,不需要加上头文件,因为编译器通过源文件的内容可以直接知道所需头文件的名字。
在这里插入图片描述
但进行多文件编译的时候,一般不直接用gcc生成可执行程序,而是先用每个源文件生成各自的二进制文件,即.o文件,然后再将这些二进制文件通过链接生成可执行程序。但是随着源文件个数的增加,指令长度也会增长,所以我们就需要用到项目自动化构建工具make/Makefile,这样可以大大提高编译运行的效率。

原因

  1. 如果直接使用源文件生成可执行程序,那么若有一个.c文件发生了修改,我们再生成可执行文件就需要将之前的所有源文件重新进行编译链接。
  2. 如果每个源文件先生成自己的.o目标文件,那么一个源文件被修改,我们就只需要重新编译该源文件的二进制文件,然后将所有二进制文件进行链接。这样大大提高了程序编译运行的效率。

步骤一: 在源文件所在目录下创建一个名为Makefile/makefile的文件。
步骤二: 编写Makefile文件。
在这里插入图片描述
执行结果
在这里插入图片描述

补充:Makefile文件的快捷书写方式

  1. $@:表示依赖关系中的目标文件(冒号左侧)。
  2. $^:表示依赖关系中的依赖文件列表(冒号右侧)。
  3. $<:表示依赖关系中的第一个依赖文件(冒号右侧第一个)。

所以上述文件,还可以写成:
在这里插入图片描述

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

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

相关文章

2023美赛春季赛Z题模型代码

已经完成模型代码&#xff0c;仅供大家参考&#xff0c;需要更多请看文末 一、问题分析 首先需要收集与奥运会举办城市/国家相关的历史数据。这需要涉及诸如经济、土地利用、人类满意度&#xff08;包括运动员和观众&#xff09;、旅行、基础设施建设、环境影响等多个方面。数…

(二)【软件设计师】计算机系统—CPU运算器控制器

文章目录一、CPU1.计算机硬件基本组成&#xff08;了解&#xff09;2.中央处理单元&#xff08;了解&#xff09;3.CPU组成4.例题二、运算器1.运算器有两个主要功能2.简要介绍运算器中各组成部件的功能三、控制器1.例题2.组成部分四、总结一、CPU 1.计算机硬件基本组成&#x…

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

最近一直有一个问题&#xff0c;如鲠在喉。争取早一天解决&#xff0c;早一天踏踏实实的睡觉。 问题是&#xff1a;在ES中&#xff0c;一条JSON数据是如何写入到磁盘上的&#xff1f; 如何解决这个问题&#xff1f;我想到了chatGPT&#xff0c;还有lucene的学习资料。这篇文章&…

港科夜闻|香港科大(广州)创邻图数据联合实验室正式成立

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)创邻图数据联合实验室正式成立。未来&#xff0c;香港科大(广州)与「创邻科技」双方将围绕万亿级大图神经网络计算框架、海量数据的时序图处理、分布式原生图数据库事务及性能优化等前沿图技术领域研究展开深…

Cocos Creator的Hello World

0、文档 Cocos官网文档 1、下载 访问cocos官网下载Cocos Dashboard 安装时选项安装 Visual Studio 2017可以不勾选 注意&#xff1a;Cocos Dashboard的快捷方式文件名为CocosDashboard.exe&#xff0c;不要误认为是安装文件 2、注册、登录 注册/登录cocos网址 3、Cocos D…

深度学习之CD数据集创建

深度学习之数据集创建1. 原始文件相关文件路径2. 数据集创建2.1 数据格式一2.2 数据格式二1. 原始文件相关文件路径 原始路径 对于label图片文件&#xff0c;通道需要为单通道&#xff0c;如果不是单通道&#xff0c;训练数据会报错 报错信息例如&#xff1a;ValueError: Mask…

自然语言处理(八):Lexical Semantics

目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstra…

波形失真总结

失真是输入信号与输出信号在幅度比例关系、相位关系及波形形状产生变化的现象。音频功放的失真分为电失真和声失真两大类。电失真是由电路引起的&#xff0c;声失真是由还音器件扬声器引起的。电失真的类型有&#xff1a;谐波失真、互调失真、瞬态失真。声失真主要是交流接口失…

idea使用之 单词拼写检查设置 分级管理

前言 idea的智能提示使用起来非常顺手, 拼接检查也是其中一项, 有些字段什么的, 不小心将单词的字母顺序写错了, idea的拼接检查就会提示(前提是字段命名规范,并且乱序之后的不再是一个具有意义的单词), 如此一来, 就能规避很多粗心大意的错误. 但是呢, 有些时候,项目中有些自…

用Claude和Stable Diffusion绘制《武松打虎》

绘制四大名著的经典画面 现在最火爆的AI&#xff0c;分为两类&#xff0c;一个是文本生成&#xff0c;一个是图片生成。如果让这两种结合到一起来&#xff0c;会是什么样的效果的。 这样是不是可能帮我们绘制很多场景下的图片&#xff0c;比如四大名著&#xff0c;帮我们的四…

Numpy基础用法

Numpy 【Numerical Python】是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务&#xff0c;使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组&#xff0c;该对象是一个快…

【项目分析】基于工艺融合的数控编程方法的设计与实现

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招项目的&#xff0c;按照面试常问及项目核心点整理 &#x1f970;来源&#xff1a;该项目源于数控系统迭代的实验项目 &#x1f92d;结语&#xff1a;如果有帮到你的地方&#xff0c;就点个赞和关注…

新版 Spring Security 配置的变化

进入到 SpringBoot2.7 时代&#xff0c;有小伙伴发现有一个常用的类忽然过期了&#xff1a; 在 Spring Security 时代&#xff0c;这个类可太重要了。过期的类当然可以继续使用&#xff0c;但是你要是决定别扭&#xff0c;只需要稍微看一下注释&#xff0c;基本上就明白该怎么玩…

机器视觉公司,在玩一局玩不起的游戏

导语 有个著名咨询公司曾经预测过&#xff1a;未来只有两种公司&#xff0c;是人工智能的和不赚钱的。 它可能没想到&#xff0c;还有第三种——不赚钱的AI公司。 去年我们报道过“正在消失的机器视觉公司”&#xff0c;昔日的“AI 四小龙”&#xff08; 商汤、旷视、云从、依图…

大数据 | HBase基本工作原理

前文回顾&#xff1a;MapReduce基本原理 目录 &#x1f4da;HBase基本介绍 &#x1f407;HBase的设计目标和功能特点 &#x1f407;HBase在Hadoop中的生态环境 &#x1f4da;HBase的数据模型 &#x1f407;逻辑数据模型 &#x1f407;物理存储格式 &#x1f4da;HBase基…

rust网络编程以及unsafe模块

网络层目前 IPv4 和 IPv6 分庭抗礼&#xff0c;IPv6 还未完全对 IPv4 取而代之&#xff1b;传输层除了对延迟非常敏感的应用&#xff08;比如游戏quic协议&#xff09;&#xff0c;绝大多数应用都使用 TCP&#xff1b;而在应用层&#xff0c;对用户友好&#xff0c;且对防火墙友…

PageRank算法介绍

互联网上有数百亿个网页&#xff0c;可以分为这么几类&#xff1a;不含有用信息的&#xff0c;比如垃圾邮件&#xff1b;少数人比较感兴趣的&#xff0c;但范围不是很广的&#xff0c;比如个人博客、婚礼公告或家庭像册&#xff1b;很多人感兴趣的并且十分有用的&#xff0c;比…

基于DBN神经网络的语音分类识别

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的语音分类识别 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法应用于语音分类 DBN神…

排污口漂浮物监测系统 yolov5

排污口漂浮物监测系统通过YOLOV5网络模型技术&#xff0c;排污口漂浮物监测算法模型对河道两岸各处排污口进行7*24小时不间断实时监测&#xff0c;当监测到河道两岸的排污口违规乱排乱放时&#xff0c;不需人为干预系统立即抓拍存档告警。我们选择当下YOLO卷积神经网络YOLOv5来…

实现数字化转型升级,快速开发平台流辰信息来助力!

在如今迅猛发展的年代里&#xff0c;科技的力量是伟大的&#xff0c;可以让老百姓的生活变得丰富多彩&#xff0c;也可以让各行各业的企业实现办公自动化&#xff0c;朝着数字化转型升级&#xff0c;快速提升办公协作效率。快速开发平台流辰信息作为一家低代码平台服务商&#…