【Linux】-自动化构建工具(make/makefile)

news2024/12/19 21:48:27

作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言


前言

今天我们来讲讲再Linux中开发必备的一项技能,没有这个技能就不适合大型项目的开发,虽然后来这个功能会有专门的工具生成,但是我们要明白他的原理才行,就好比我们以后学了STL,但是也要学习底层原理,才能孰能生巧,今天讲的知识点就是自动化构建工具make/makefile,接下来我就给大家具体介绍一下吧


make: 是一条指令
makefile: 是一个项目目录下的文件

再我们的vs上我们不管是写一个文件还是多文件的项目,想要使程序跑起来,变成可执行程序,直接快捷键,或者上方按键点一下就行了,那为什么像vs这种开发软件可以直接将多个文件直接编译呢??他的底层肯定也有自动化构建的工具使他能完成这一系列的操作。
那我们的make就相当于快捷键,而makefile相当于把多个源文件打包再一个文件里面,通过make直接编译所有源文件,就不需要一个个gcc进行编译。而且清理生成的文件也可以放在makefile文件里面,实验make去执行。

给大家把模糊概念讲清楚了,接下来我就勇案例具体给大家介绍
在这里插入图片描述
我们创建一个叫make的项目目录,里面写文件,创建一个makefile,目前makefile文件里面是空内容。


接下来先来了解两个概念:依赖关系,依赖方法

有一天你给你爸打电话,说要打钱给我了,依赖关系是父子,依赖方法是打钱,缺少了这个依赖关系,就不会打钱给你了。大家先简单理解一下。

我们再上面说过,程序经过预处理,翻译,汇编,链接,生成下面几个文件,他们直接的依赖关系是什么:

hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c

想要编译这些文件或者重新清理文件,传统的方式是:
在这里插入图片描述

现在有了依赖关系和依赖方法,我们可以这样去做编译我们的程序,接下来我们再来编写makefile

在这里插入图片描述
我们退出保存,使用make试试:
在这里插入图片描述
我们对比一下makefile文件里面的内容,看着是从下往下面执行的,但实际从上往下扫描的,当依赖方法找不到对应的文件,就会往下面找,有点像栈的形式,大家试着理解一下,我们每次只需要使用一个make,就可以直接把我们想要的文件都生成了,不需要每个文件运行的时候都需要gcc一下太麻烦了。

对于清理文件:
在这里插入图片描述
在这里插入图片描述
伪目标:

.PHONY:clean//声明clean是伪目标文件

在这里插入图片描述
我们发现一次make之后,就make不行了,提示可执行程序是最新的了,我们来执行一下清理工作看看:

在这里插入图片描述
他可以执行很多次,按这个效果,我们把之前所有的都变成伪目标看看:
在这里插入图片描述
一般的我们只把清理工作弄成伪目标文件,为什么要这么做呢??
我个人理解是清理可以一直呗执行时当心清理不干净,而文件已经时最新编译状态了,就不需要再执行,大家知道伪目标文件就好的。

注意:

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

原因是当只输入make的时候,会优先匹配第一个目标文件进行执行,后面的执行就必须加目标文件名才可以,这一点大家要理解。


makefile怎么知道我的程序是最新状态的
再上面说到过,我们make一次之后再make就不行了,因为普通的目标文件不能总是被执行的,因为最新的可执行文件是最新的,就不能一直被执行,所以我们想要知道make是怎么知道我们的可执行文件是最新的状态,他肯定通过一定的指标去对比才会发现它是最新的

我们使用stat来查看:
在这里插入图片描述
它是通过这三个时间来对比之前的文件判断是否需要去重新执行make指令,具体就不给大家演示了,有兴趣的可以自己下来测试一下,大家知道他是这样判断的就行了。

多文件案例:
在这里插入图片描述
我们来看看自动化构建是怎么完成的:
在这里插入图片描述
相信大家应该堆自动化构建工具了解差不多了,对于我们学习来说,我今天所讲的大家掌握就足够了,以后到公司开发后,会有自动生成构建化的工具,不需要自己写了,那样就更方便了。

对比vs上的操作:
在这里插入图片描述

vs上的重新生成解决方案就相当于make
清理解决方案就相当于make clean

那我们今天的知识点就先分享到这里了,我们下篇再见
在这里插入图片描述

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

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

相关文章

【OpenMMLab AI实战营第二期】深度学习预训练与MMPretrain

深度学习预训练与MMPretrain MMPreTrain 算法库介绍 MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup,并开发…

项目干系人管理实用方法,让你的项目顺风顺水

项目管理中的干系人是每个项目的一个重要方面,因为项目的结果取决于他们。然而,管理各种各样的干系人的艺术很有挑战性。在项目管理中根本没有出错的余地,本文将带你了解项目干系人以及如何管理他们以促进项目的全面成功。 谁是项目管理的干…

第3章:SpringMVC获取请求参数

一、SpringMVC获取请求参数 1.通过servletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 <a th:href"{/testServletAPI(usernameadmin,password123456)}">测试API<…

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示 如下图所示,在博途中新建项目后,添加自己所需的数据类型,然后选中该数据类型,右击选择“从块生成源“—”仅所选块“, 如下图所示,设置文件名后点击保存, 如下图所示,选中需要导出的DB块,右击选…

人事项目开发记录-登录模块

人事项目开发记录 后端接口实现 后端接口实现 后端权限认证采用Spring Security实现&#xff08;本小节中大量知识点与第10章的内容相关&#xff0c;需要读者熟练掌握第10章的内容&#xff09;&#xff0c;数据库访问使用MyBatis&#xff0c;同时使用Redis实现认证信息缓存。因…

如何在Centos的SSH2终端中终止-停止-结束某个Python程序的运行?

python3 /opt/python_scripts/retr/P-0006.py &我在运行上面的命令后&#xff0c;得到了下面的提示&#xff1a; [1] 42335 如果我想终止这个我自己写的Python程序&#xff0c;该怎么做呢&#xff1f; 答&#xff1a; 当您在后台运行一个命令时&#xff0c;终端会显示类似…

Django中使用openldap实现账号的统一管理

了解和安装 ldap ldap介绍 LDAP&#xff08;Lightweight Directory Access Protocol&#xff09;是一种轻量级的目录访问协议&#xff0c;它用于访问和维护分布式目录服务。 LDAP最初设计用于提供对X.500目录服务的简化访问&#xff0c;后来被广泛应用于各种应用程序和系统中…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图&#xff0c;接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Word控件Spire.Doc 【其他】教程(6):从 Word 中提取 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

chatgpt赋能python:Python后退命令:如何让你的程序退回到之前的状态

Python后退命令&#xff1a;如何让你的程序退回到之前的状态 Python是一种高级编程语言&#xff0c;因其易读易懂而闻名于世。Python中有很多命令用于编写程序&#xff0c;其中一项重要的命令是后退命令。本文将介绍Python后退命令的使用方法&#xff0c;并为您提供详细的步骤…

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

ChatGPT热度不减 六月份了&#xff0c;朋友们&#xff0c;来到六月份了已经&#xff0c;ChatGPT的热度依旧不减&#xff0c;各大论坛网站的榜单上还飘着ChatGPT相关话题的文章&#xff0c;且排名靠前。由此可见&#xff0c;这ChatGPT这股子热潮还得持续一段时间呢。 而且ChatG…

cuda block grid等介绍

这里写目录标题 cuda层次结构程序架构层次结构cuda程序调用cuda 内置变量GPU内存模型内存结构 可编程内存内存作用域寄存器本地内存共享内存共享内存访问冲突常量内存全局内存gpu缓存 cuda层次结构 程序架构 申请内存时是线性的内存&#xff0c;需要知道是按行还是按列排列 设计…

【Linux】Linux内核编译与入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux内核编译。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

DM数据库TEXT类型字段查询返回时的问题

一、问题描述&#xff1a; 在项目中使用到了DM数据库连接&#xff0c;查询某些数据&#xff0c;然后以Map形式返回时TEXT类型是会出现一些问题&#xff0c;默认会转换为dm.jdbc.driver.DmdbNClob类型的对象&#xff0c;某些情况下&#xff08;不知道具体原因&#xff09;在JSON…

移动端布局之flex布局1:flex布局体验、flex布局原理、flex布局父项常见属性

移动端布局之flex布局1 flex布局体验传统布局和flex弹性布局的区别初体验index.html flex布局原理布局原理 flex布局父项常见属性常见父项属性flex-direction设置主轴的方向&#xff08;重要&#xff09;主轴与侧轴属性值flex-direction: row;flex-direction: row-reverse;flex…

笔试强训9

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 文章简介&#xff1a;简单记录学习的细碎~ day15 一. 单选 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是&#xff08; &#xff09; A Select sum(math),avg(chinese) from score B Select *,s…

麒麟V10防火墙,VNC,YUM源, nfs ,磁盘格式化

麒麟V10防火墙&#xff0c;VNC&#xff0c;YUM源&#xff0c; nfs &#xff0c;磁盘格式化 麒麟V10开启防火墙并设置开机自启 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁…

2023年Q1电商平台饮料行业数据分析报告

我国的饮料市场非常庞大&#xff0c;从碳酸饮料到茶饮料&#xff0c;从功能性饮料到水&#xff0c;各个品类都有广泛的消费者基础。加之如今饮料消费场景不断延伸&#xff0c;家庭囤货、户外即饮、运动健身等成为消费者饮料需求的新场景&#xff0c;新需求带动线上饮料市场持续…

Numpy---创建多维数组、创建正态分布、创建均匀分布

1. 创建一个随机整数的多维数组 np.random.randint(low, highNone, sizeNone, dtypel) 参数说明: low : 最小值 highNone: 最大值 highNone时&#xff0c;生成的数值在【0, low&#xff09;区间内 如果使用high这个值&#xff0c;则生成的数值在【low, high&#xff09;区…

Nginx服务——主配置文件-nginx.conf

一、全局配置的6个模块简介 模块说明全局块全局配置&#xff0c;对全局生效events块配置影响 Nginx 服务器与用户的网络连接http块配置代理&#xff0c;缓存&#xff0c;日志定义等绝大多数功能和第三方模块的配置server块配置虚拟主机的相关参数&#xff0c;一个 http 块中可…