目录

  • 一、自动化构建
  • 二、make/Makefile
    • 2.1 见识一个简单的make/Makefile
    • 2.2 Makefile的基本语法
    • 2.3 Makefile的语法细节

在这里插入图片描述
个人主页<—请点击
Linux专栏<—请点击

一、自动化构建

自动化构建是指通过构建工具(如make)解析构建脚本(如Makefile),自动执行一系列步骤(编译、链接等)以将源代码生成可执行程序或库的过程

想象一下你要编译一个大型C++项目,比如一个游戏引擎,它有成千上万个源文件.cpp和头文件.h

如果没有自动化构建,你会怎么做?你可能会在终端里输入一条巨长的命令:g++ main.cpp renderer.cpp physics.cpp audio.cpp network.cpp ...(列出所有文件) -o MyGameEngine -lSDL2 -lOpenGL ...,这种方法效率低下、容易出错、无法复用,并且依赖管理困难。自动化构建就是为了解决这些问题而生的。

所以会不会写Makefile,从侧面说明了一个人是否具备完成大型工程的能力。在Windowsvs帮我们做了自动化构建,而Linux下我们需要使用make/Makefile完成对自动化项目的构建。

上述我们所说的makeMakefile,其中前者是一条命令,而后者是一个文件。后者也可以写成makefile

二、make/Makefile

2.1 见识一个简单的make/Makefile

现在我们在我们的当前目录下准备了一份文件code.c,里面写了一些代码,现在我要使用make对它进行编译。我们开始创建Makefile文件,并在其中写入以下指令:
在这里插入图片描述
我们执行make命令对code.c进行编译。
在这里插入图片描述
如上图,make命令自动执行了我在Makefile文件中写入的指令生成了可执行文件!

那么Makefile中写的那两行究竟是什么意思呢?接着往下看。
在这里插入图片描述
如上图,形成code.exe目标文件需要依赖code.c文件,而解决依赖关系需要依赖下面的依赖方法gcc -o code.exe code.c,所以依赖关系和依赖方法共同构成了形成可执行程序的语义。

2.2 Makefile的基本语法

其中上面的 依赖方法一行必须以Tab键开头,且对应的依赖方法可以是多条,接下来我们依据上期博客讲解的编译的详细过程进行编写Makefile文件。注意:Makefile里面想要注释是#
在这里插入图片描述
执行make命令:
在这里插入图片描述
如上图,make命令会解析Makefile文件,解析过程中会形成推导栈,这个栈中是依赖方法的集合,直到找到存在的依赖文件时就会执行相应的依赖方法,然后依次出栈,就形成了上图中依次运行的指令。如果make推导失败了它就会报错

Makefile其实就是一种脚本语言,make要从最终目标code.exe开始,递归地向下检查依赖,再向上决定是否构建。这个过程是深度优先的

当然我们实际的写法可不会这样写,太麻烦了。

接下来我们学习一个新的语法,我们在vs下不仅要能够生成可执行程序,我们还需要能够清理呀,所以接下来清理可执行程序。
在这里插入图片描述

其中.PHONY的作用是声明一个符号clean是伪目标clean的依赖方法是清理可执行程序,这样就可以清理了。
在这里插入图片描述

从上面clean的执行操作,我们可以知道 make命令后面可以直接跟“目标名”
在这里插入图片描述
如上图,make命令后面跟谁就会解析谁的依赖关系和依赖方法,并且make命令默认只会推导一条完整的链路

现在我把.PHONY:clean部分放在前面,再执行make命令。
在这里插入图片描述
所以单独执行make指令,默认只推导第一个依赖关系对应的推导链。

.PHONY:用来修饰一个目标文件是伪目标,这个我们刚讲过。伪目标的本质是总是被执行的。像我们的形成code.exe的命令通常情况下只能被执行一次
在这里插入图片描述
而当我们对code.exe进行修饰后就可以一直执行了。
在这里插入图片描述
不建议.exe.PHONY修饰,这样能够加快编译的效率,而且当你的源文件再次被修改后,就又可以进行编译操作了。
在这里插入图片描述
那么无法二次编译老项目是如何做到的呢? 答案是通过比较创建时间的新旧

在这里插入图片描述
Linux下有一个stat命令,可以查看文件的相关时间信息。
在这里插入图片描述
当源文件code.c文件内容被更改时间比code.exe的文件内容被更改时间新,make就允许进行重新编译。而.PHONY修饰能够总是执行,是让make工具忽略了时间对比

扩充:上图中,文件内容被更改时Modify时间会更改,文件属性被更改时Change时间会更改,文件被访问特定次数后,Access时间会更改

2.3 Makefile的语法细节

我们在了解基本语法的时候,我们发现编译、清理的过程,make会将执行命令回显出来,为了不让它回显出来,可以在命令前加上@
在这里插入图片描述

现在假设我要对生成的文件名进行修改,我还要一个名称一个名称更改,太麻烦了吧,所以我们使用变量对Makefile做出大的更改!
在这里插入图片描述
如上图所示,我对Makefile文件进行了更改,接下来我们逐行分析。首先定义了两个变量名BINSRC分别代表目标文件源文件注意=两侧不要加空格。下面的$()的作用相当于提取变量名对应的文件第五行中的$@$^是自动变量,前者代表目标文件,后者代表依赖文件

很好,现在我们能够编译一个源文件了,那如果源文件有100个呢?
在这里插入图片描述
如上图,创建了100个源文件,现在我们要将他们编译性成一个可执行程序。我们要按照下图的方式进行编译:
在这里插入图片描述
首先,如何获取这100个源文件就是一个问题,一个个写吗? 当然不行,这里我们可以使用shell命令ls进行获取,或者使用Makefile中自带的wildcard函数获取。
在这里插入图片描述
这就是两种获取源文件的方法,第一个是执行ls命令将列出的源文件提取写入到SRC中,第二个是使用指定函数获取源文件。

接下来完成Makefile的编写。
在这里插入图片描述
为了获取.o文件,我们还要定义一个变量OBJ,其中SRC:.c=.o是将SRC的所有同名.c替换成为.o形成目标文件列表。接下来又对gcc、rm -rf、echo命令进行了包装。然后在编译的过程将每个文件的.c.o的过程和.o可执行程序的过程使用echo打印了出来。

另外%.c展开当前目录下所有的.c%.o: 同时展开当前目录下所有的.ogcc -c code.c -o code.o这个命令的-o code.o部分也可以去掉,所以就变成了上图中这样,%<是将展开的依赖.c文件,⼀个⼀个的交给gcc

在这里插入图片描述
如上图执行make命令,它就自动将100个源文件先编译成.o,然后再进行链接编译成了可执行程序code.exe。我们试着运行一下。
在这里插入图片描述

在这里插入图片描述
如上图再make clean它就自动将形成的.o可执行程序清除了!

总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在企业微信上以 HTTPS 方式访问内网 OA/ERP 等系统?

企业微信可以将 ZeroNews 平台上添加的内网应用集成到企业微信的工作台。这样&#xff0c;用户即使在外部网络环境中&#xff0c;也可以通过企业微信访问内网的 OA、ERP 等应用。以下是企业在 Linux 服务器上部署 OA 系统&#xff0c;并通过 ZeroNews 通过互联网访问 OA 系统的…

Windows 11 安装使用 nvm,Node.js、npm多版本管理、切换

Windows 11 安装使用 nvm&#xff0c;Node.js、npm多版本管理、切换 文章目录Windows 11 安装使用 nvm&#xff0c;Node.js、npm多版本管理、切换1. nvm 简介2. 安装、配置 nvm2.1. 卸载现有 Node.js&#xff08;非常重要&#xff01;&#xff09;2.2. 下载 nvm-windows 安装包…

在LazyVim中配置Rust开发环境

要在LazyVim中配置Rust开发环境&#xff0c;包括代码补全、格式化、调试等功能&#xff0c;可以按照以下步骤进行配置&#xff1a; 1. 确保基础环境 首先确保你已经安装了&#xff1a; Rust工具链 (rustup, rustc, cargo)LazyVim已正确安装 # 安装Rust工具链 curl --proto http…

LeetCode热题100--114. 二叉树展开为链表--中等

1. 题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 …

REST API 设计最佳实践指南 - 如何用 JavaScript、Node.js 和 Express.js 构建 REST API

过去几年里&#xff0c;我创建并使用过很多 API。在此过程中&#xff0c;我遇到过各种好的和坏的实践&#xff0c;也在开发和调用 API 时碰到过不少棘手的问题&#xff0c;但也有很多顺利的时刻。 网上有很多介绍最佳实践的文章&#xff0c;但在我看来&#xff0c;其中不少都缺…

MyCat

文章目录18.1 MySQL 读写分离概述18.1.1 工作原理18.1.2 为什么要读写分离18.1.3 实现方式18.2 什么是 MyCat18.3 MyCat 安装与配置1. 下载与解压2. 创建用户并修改权限3. 目录说明4. Java 环境要求18.4 MyCat 启动与配置1. 配置环境变量2. 配置 hosts&#xff08;多节点集群&a…

使用 Spring Boot 搭建和部署 Kafka 消息队列系统

使用 Spring Boot 搭建和部署 Kafka 消息队列系统 摘要 本文将引导您在 Kafka 上搭建一个消息队列系统&#xff0c;并整合到您的 Spring Boot 项目中。我们将逐步实现这一方案&#xff0c;探讨其中的关键原理&#xff0c;避开可能遇到的坑&#xff0c;并最终将其部署到 Kuberne…

daily notes[45]

文章目录basic knowledgereferencesbasic knowledge the variable in Rust is not changed. let x5; x6;Rust language promotes the concept that immutable variables are safer than variables in other programming language such as python and and are in favour of th…

技术奇点爆发周:2025 年 9 月科技突破全景扫描

技术奇点爆发周&#xff1a;2025 年 9 月科技突破全景扫描当中国 "祖冲之三号" 量子计算机在特定任务上超越经典超级计算机一千万亿倍的算力新闻&#xff0c;与 OpenAI 宣布 100 亿美元定制芯片量产协议的消息在同一周密集爆发时&#xff0c;我们真切感受到了技术革命…

分布式专题——10.3 ShardingSphere实现原理以及内核解析

1 ShardingSphere-JDBC 内核工作原理当往 ShardingSphere 提交一个逻辑SQL后&#xff0c;ShardingSphere 到底做了哪些事情呢&#xff1f;首先要从 ShardingSphere 官方提供的这张整体架构图说起&#xff1a;1.1 配置管控在 SQL 进入 ShardingSphere 内核处理&#xff08;如解析…

移动语义的里里外外:从 std::move 的幻象到性能的现实

我们都已经听过这样的建议&#xff1a;“使用 std::move 来避免昂贵的拷贝&#xff0c;提升性能。” 这没错&#xff0c;但如果你对它的理解仅止于此&#xff0c;那么你可能正在黑暗中挥舞着一把利剑&#xff0c;既可能披荆斩棘&#xff0c;也可能伤及自身。 移动语义是 C11 带…

selenium完整版一览

selenium 库驱动浏览器selenium库是一种用于Web应用程序测试的工具,它可以驱动浏览器执行特定操作,自动按照脚本代码做出单击、输入、打开、验证等操作,支持的浏览器包括IE、Firefox、Safari、Chrome、Opera等。而在办公领域中如果经常需要使用浏览器操作某些内容,就可以使用se…

[Linux]学习笔记系列 -- lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区

文章目录lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区历史与背景这项技术是为了解决什么特定问题而诞生的&#xff1f;它的发展经历了哪些重要的里程碑或版本迭代&#xff1f;目前该技术的社区活跃度和主流应用情况如何&#xff1f;核心原理与…

MFC_Install_Create

1. 安装MFC 编写MFC窗口应用程序需要用到Visual Studiohttps://visualstudio.microsoft.com/zh-hans/&#xff0c;然后安装&#xff0c;要选择使用C的桌面开发&#xff0c;再点击右边安装详细信息中的使用C的桌面开发&#xff0c;往下滑&#xff0c;有一个适用于最新的v143生成…

Langchain4j开发之AI Service

学习基于Langchain4j的大模型开发需要学习其中Ai Service的开发模式。里面对大模型做了一层封装&#xff0c;提供一些可以方便调用的api。其中有两种使用Ai Service的方式。一.编程式开发1.首先引入Langchain4的依赖。<dependency><groupId>dev.langchain4j</gr…

认识神经网络和深度学习

什么是神经网络&#xff1f;什么又是深度学习&#xff1f;二者有什么关系&#xff1f;……带着这些疑问&#xff0c;进入本文的学习。什么是神经网络神经网络&#xff08;Neural Network&#xff09;是一种模仿生物神经系统&#xff08;如大脑神经元连接方式&#xff09;设计的…

医疗行业安全合规数据管理平台:构建高效协作与集中化知识沉淀的一体化解决方案

在医疗行业中&#xff0c;数据不仅是日常运营的基础&#xff0c;更是患者安全、服务质量和合规管理的核心载体。随着医疗业务的复杂化和服务模式的多元化&#xff0c;各类机构——从大型医院到科研中心——都面临着海量文档、报告、影像资料和政策文件的管理需求。这些资料往往…

Day25_【深度学习(3)—PyTorch使用(5)—张量形状操作】

reshape() squeeze()unsqueeze()transpose()permute()view() reshape() contiguous() reshape() 一、reshape() 函数保证张量数据不变的前提下改变数据的维度&#xff0c;将其转换成指定的形状。def reshape_tensor():data torch.tensor([[1, 2, 3], [4, 5, 6]])print(data…

第十八篇 开发网页教学:实现画布、绘画、简易 PS 方案

在网页开发领域&#xff0c;画布功能是实现交互创作的重要基础&#xff0c;无论是简单的绘画工具&#xff0c;还是具备基础修图能力的简易 PS 方案&#xff0c;都能为用户带来丰富的视觉交互体验。本篇教学将围绕 “学习 - 实践 - 实操” 的核心思路&#xff0c;从技术原理讲解…

封装形成用助焊剂:电子制造“隐形桥梁”的技术突围与全球产业重构

在5G通信、人工智能、新能源汽车等新兴技术驱动下&#xff0c;全球电子制造业正以年均6.8%的增速重构产业链。作为电子元件焊接的核心辅料&#xff0c;封装形成用助焊剂&#xff08;又称电子封装用助焊剂&#xff09;凭借其“优化焊接质量、提升可靠性、降低制造成本”的核心价…