了解Linux 中 make 与 Makefile

目录

一、为什么开发者需要构建工具?

二、make/Makefile

1. Makefile基本规则

2.清理项目

三、make的工作原理


一、为什么开发者需要构建工具?

在软件开发中,我们经常面临这样的场景:一个项目包含数十个源代码文件,需要经过编译、链接、测试等多个步骤。手动执行每个步骤不仅效率低下,更可能因操作失误导致构建失败。这正是GNU make工具及其搭档Makefile大显身手的舞台。


二、make/Makefile

make是一个命令工具,是一个解释Makefile中指令的命令工具

1. Makefile基本规则

target: prerequisitesrecipe
  • target:构建目标(通常是文件名或伪目标)

  • prerequisites:依赖文件(目标构建所需的文件或目标)

  • recipe:构建命令(必须以 Tab 开头,不能用空格)

示例:

make命令也可以写成是make test,为什么可以将test省略呢?因为make后面什么都不带会自动找到Makefile文件中的第一条依赖关系并执行依赖方法。


2.清理项目

上述示例我们生成了test可执行程序,如何进行清理项目呢?


那为什么要用.PHONY伪目标声明clean呢?

我们先多执行make命令几次试试看

只有修改test.c文件才能重新make,否则make就无效

gcc -o test test.c这个命令执行会有时间对比,它会对比test的修改时间和test.c修改时间,如果test的修改时间比test.c修改时间大,就不会执行(test总是在test.c之后才可形成)

.PHONY:让目标文件对应的方法总是被执行(让依赖方法忽略掉时间对比)

现在我们都注释掉伪目标


三、make的工作原理

make 的工作流程可以分为以下几个步骤:

1) 读取 Makefile

  • make 首先会查找当前目录下的 Makefile 或 makefile 文件。

2) 确定目标

  • 如果没有指定目标(也就是只输入make),make 会构建 Makefile 中的第一个目标文件(默认目标)。

  • 如果指定了目标(例如 make clean),make 会构建clean目标。

3) 解析依赖关系

  • make 会解析目标的依赖关系,递归检查所有依赖文件是否需要更新。

  • 如果依赖文件也是目标,make 会先构建这些依赖文件。

4) 完成构建

  • 当所有目标和依赖都处理完毕后,make 会结束构建过程。


依赖关系:

  • test依赖test.o
  • test.o依赖test.s
  • test.s依赖test.i
  • test.i依赖test.c

test依赖的文件test.o不存在,继续往后找,找到test.o依赖test.s不存在,继续往后找,...到test.i依赖test.c文件存在,就执行gcc -E test.c -o test.i生成test.i文件,依次往上执行(像一个栈的过程)。

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

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

相关文章

RK3568中,使用cmake搭建C++工程进行RGA开发

在 RK3568 平台上使用 C 配合 RGA (Raster Graphics Acceleration) 进行图像加速开发,以下是详细的配置步骤和示例: 1. 环境准备 安装 RK3568 SDK 确保已安装 Rockchip 官方提供的 SDK(如 Linux SDK),RGA 头文件和库通…

win11右击显示全部

正常: 输入: reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重启或刷新进程 刷新: taskkill /f /im explorer.exe & start explorer.exe 成功:

Redis基础--常用数据结构的命令及底层编码

零.前置知识 关于时间复杂度,按照以下视角看待. redis整体key的个数 -- O(N)当前key对应的value中的元素个数 -- O(N)当前命令行中key的个数 -- O(1) 一.string 1.1string类型常用命令 1.2string类型内部编码 二.Hash 哈希 2.1hash类型常用命令 2.2hash类型内部编码 2.3ha…

React 设计模式:实用指南

React 提供了众多出色的特性以及丰富的设计模式,用于简化开发流程。开发者能够借助 React 组件设计模式,降低开发时间以及编码的工作量。此外,这些模式让 React 开发者能够构建出成果更显著、性能更优越的各类应用程序。 本文将会为您介绍五…

SpringBoo项目标准测试样例

文章目录 概要Controller Api 测试源码单元测试集成测试 概要 Spring Boot项目测试用例 测试方式是否调用数据库使用的注解特点单元测试(Mock Service)❌ 不调用数据库WebMvcTest MockBean只测试 Controller 逻辑,速度快集成测试&#xff0…

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本, Unity中其他的特殊文件夹可以参考官方文档链接,如下: Unity - 手册:保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…

Vue3+codemirror6实现公式(规则)编辑器

实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…

K8S QoS等级

在 Kubernetes (K8S) 中,QoS(Quality of Service,服务质量)等级用于定义 Pod 在资源调度和管理过程中的优先级,确保在资源紧张时能够更好地管理和分配资源。Kubernetes 根据 Pod 的资源请求和限制将 Pod 分为三种 QoS …

4.PPT:日月潭景点介绍【18】

目录 NO1、2、3、4​ NO5、6、7、8 ​ ​NO9、10、11、12 ​ 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿,命名为“PPT.pptx”(“.pptx”为扩展名)新建幻灯片 开始→版式“PPT_素材.doc…

如何在macOS上安装Ollama

安装Ollama 安装Ollama的步骤相对简单,以下是基本的安装指南: 访问官方网站:打开浏览器,访问Ollama的官方网站。 下载安装包:根据你的操作系统,选择相应的安装包进行下载。 运行安装程序:下载完…

开源项目介绍-词云生成

开源词云项目是一个利用开源技术生成和展示词云的工具或框架,广泛应用于文本分析、数据可视化等领域。以下是几个与开源词云相关的项目及其特点: Stylecloud Stylecloud 是一个由 Maximilianinir 创建和维护的开源项目,旨在通过扩展 wordclou…

Redis双写一致性(数据库与redis数据一致性)

一 什么是双写一致性? 当修改了数据库(MySQL)中的数据,也要同时更新缓存(redis)中的数据,缓存中的数据要和数据库中的数据保持一致 双写一致性,根据业务对时间上的要求,…

笔记:新能源汽车零部件功率级测试怎么进行?

摘要:本文旨在梳理主机厂对新能源汽车核心零部件功率级测试需求,通过试验室的主流设备仪器集成,快速实现试验方案搭建,并体现测试测量方案的时效性、便捷性优势。目标是通过提升实现设备的有效集成能力、实现多设备测试过程的有效协同、流程化测试,可快速采集、分析当前数…

C32.【C++ Cont】静态实现双向链表及STL库的list

目录 1.知识回顾 2.静态实现演示图 3.静态实现代码 1.初始双向链表 2.头插 3.遍历链表 4.查找某个值 4.任意位置之后插入元素 5.任意位置之前插入元素 6.删除任意位置的元素 4.STL库的list 1.知识回顾 96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删 97.【C…

二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号

目录 一、程序填空📝 --- 矩阵主、反对角线元素之和 题目📃 分析🧐 二、程序修改🛠️ --- 二分法求方程根 题目📃 分析🧐 三、程序设计💻 --- 处理字符串中 * 号 题目&#x1f…

采用idea中的HTTP Client插件测试

1.安装插件 采用idea中的HTTP Client插件进行接口测试,好处是不用打开post/swagger等多个软件,并且可以保存测试时的参数,方便后续继续使用. 高版本(2020版本以上)的idea一般都自带这个插件,如果没有也可以单独安装. 2.使用 插件安装完成(或者如果idea自带插件),会在每个Con…

探讨如何在AS上构建webrtc(2)从sdk/android/Build.gn开始

全文七千多字,示例代码居多别担心,没有废话,不建议跳读。 零、梦开始的地方 要发美梦得先入睡,要入睡得找能躺平的地方。那么能躺平编译webrtc-android的地方在哪?在./src/sdk/android/Build.gn。Build.gn是Build.nin…

Linux firewalld开启日志审计功能(2)

在Firewalld防火墙中启用和配置logdenied选项,记录被拒绝的数据包(等同于开启日志功能) 效果展示: 1.开启日志记录功能 firewall-cmd --set-log-deniedunicast #重新加载生效配置 firewall-cmd --reload 2.配置rsyslog捕获日志…

Spring Web MVC项目的创建及使用

一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…

oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)

索引通过存储列的排序值来加快对表中数据的访问速度,帮助数据库系统快速定位到所需数据,避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构,适合处理范围查询和精确查找。它的设计目标是保持数据有序,并支持高效的插入…