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

『Linux升级路』基础开发工具——make/Makefile

🔥博客主页:小王又困了

📚系列专栏:Linux

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、认识make/Makefile

📒1.1make/Makefile的优点

📒1.2make/Makefile的使用

二、依赖关系和依赖方法

📒2.1依赖关系

📒2.2依赖方法

三、make工作原理


🗒️前言:

     以前我们的代码中有多个源文件,是编译器把它们链接起来,形成可执行程序。 而在linux中,需要我们手动进行这个过程,使用gcc一个一个源文件的编译十分繁琐,这就需要我们的自动化构建工具——make/Makefile。

一、认识make/Makefile

     make是一个用于自动构建(编译和链接)程序的工具,它通过读取一个叫做Makefile的文件来确定程序的构建规则和依赖关系。Makefile包含了一系列规则,每个规则指定了如何生成一个或多个目标文件,并列出了生成这些文件所需要的依赖关系和相应的命令。

  • make是一条命令
  • Makefile是一个文件

make是一个解释Makefile中指令的命令工具,两个搭配使用,完成项目自动化构建。

📒1.1make/Makefile的优点

     一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,在VS中是编译器器将这些源文件链接起来,而在Linux中需要我们自己编译,我们也不知道哪些文件需要先编译,哪些文件需要后编译,所以我们使用了自动化构建工具—make/Makefile。

📝优点:

makeMakefile的使用可以大大简化项目的构建过程,确保只有必要的文件被重新构建,提高了项目的可维护性和可重用性。自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。

📒1.2make/Makefile的使用

  • make工具的主要作用是根据Makefile文件中的规则来自动构建项目,所以我们要先创建一个Makefile文件,这里的M大写小写都可以。

  • 在makefile文件中写入依赖关系和依赖方法。

  • make的使用

这里我们可能会有一个疑问,问什么形成可执行程序只需要输入make呢。这就要我们了解make的命令行语法:基本的make命令行语法是make [target],其中targetMakefile中定义的目标名。如果没有指定目标,make将执行Makefile文件中第一个依赖方法

二、依赖关系和依赖方法

     依赖关系指的是目标文件(target)和它所依赖的文件之间的关系,而依赖方法则是描述如何生成目标文件的规则。例如:月底,你的生活费用完了,于是你给你的老爸打电话,告诉他:“老爸,我是你儿子,我没钱啦”。给你的老爸打电话,说你是他儿子,就叫做表明依赖关系。但是只表明依赖关系,你爸并不知道你是缺钱。所以要有依赖方法,要告诉他“我没钱啦”,你把才知道要给你打钱。因此,只有依赖关系加上依赖方法,才能完成打钱这件事情。

📒2.1依赖关系

     在 Make 中,依赖关系定义了目标文件和其它文件之间的关系。一个目标文件可能依赖于一个或多个文件(称为依赖项),这些文件可以是源代码文件、头文件、或者其他目标文件。依赖关系通过规则来定义,通常具有以下形式:

target: dependenciescommands
  • target 是目标文件的名称。
  • dependencies 是目标文件依赖的文件列表。
  • commands 是生成目标文件的命令,称为规则。

 示例:

mycode:code.cgcc code.c -o mycode

上述规则表示 mycode 依赖于 code.c ,生成 mycode 的命令是用gcc编译 code.c 并将输出保存为 mycode 

📒2.2依赖方法

     在 Make 中,依赖方法是指生成目标文件的具体命令或规则。上述示例中的 gcc code.c -o mycode 就是一个依赖方法。依赖方法可以包括编译、链接、拷贝等操作,具体取决于生成目标文件的需求。

  •  gcc code.c -o mycode

注意:依赖方法前面有一个Tab 

     总体来说,Make 的依赖关系和依赖方法是构建系统中非常重要的概念,通过它们可以定义项目中文件之间的关系,以及如何生成最终的可执行文件或库。

三、make工作原理

📝理解makefile

     我们要形成mycode目标文件,并不是直接依赖code.c,实际依赖的是code.o,然而我们当前目录下并没有code.o,所以我们要先形成code.ocode.o又依赖code.s,但是当前目录下也没有code.s,经过递归,我们就可以找到递归的出口code.c,然后逆向执行依赖关系。指令的执行顺序,与我们写入makefile文件的顺序是反过来的。所以,保存这些依赖关系的是一种栈式的结构

📝总结:

     mycode会自动推导依赖关系,然后根据依赖关系逆向执行依赖方法。由于是自动推导,所以mycode文件中的依赖方法可以是任意顺序,但是不能缺少。

📝make不能连续编译

如下图,当执行完一次make,对源代码编译后,再去执行make,就不会对源代码重新编译。 

这是因为我们编译得到一个可执行程序,没有在对它进行修改,就没有必要对它重新编译。那我们是怎么知道是否对源文件进行过修改的呢?

     我们对文件修改,都会有时间记录,我们通过时间就可以知道文件是否被修改过。要形成可执行文件,一定是先有源文件,再有可执行文件,所以源文件的最近修改,比可执行文件要早。如果源文件最近修改时间就比可执行文件晚,那么说明文件被修改过。

📝查看文件修改时间

  • 指令:stat  code.c

  • Access:文件最近一次被访问的时间,查看文件内容、修改文件内容,都属于访问文件。
  • Modify:最近一次修改文件内容的时间。
  • Change:最近一次修改文件属性的时间。

这三个时间是相互关联的,有的操作可能会同时更新多个时间。例如:修改文件的内容,那这三个时间都会更新,因为修改文件内容,首先要访问该文件,其次修改后,文件的大小会发生变化,所以这三个时间都会更新。

修改权限只有Change改变,上面我们修改文件内容,访问时间却没有改变,这是为什么呢?

在许多情况下,默认情况下,文件系统不会在每次文件被读取时都更新访问时间。这是为了减少磁盘I/O操作的频率,从而提高性能。

 📝手动更新文件时间

  • touch code.c:将code.c文件的所有时间更至最新。
  • touch -m code.c:将code.c文件的Modify时间更至最新
  • touch -a code.c:将code.c文件的Access时间更至最新
  • touch -c code.c:将code.c文件的Change时间更至最新

 📝.PHONY伪目标

伪目标: 用于指定一些不是真正文件名的目标,通常用于执行一些特殊的任务而不生成对应的文件。

.PHONY: clean
clean:rm -f mycode

 📝特殊符号

  • $@:表示标签,依赖关系冒号左边的内容。
  • $^:表示依赖的文件,依赖关系冒号右边的内容。
mytest:test.cgcc $^ -o $@
.PHONY:clean                                                                                                                                                                              
clean:rm -rf mytest

 📝变量 

变量: 可以在 Makefile 中定义变量,以方便在规则中引用。 

CC = gcc
flag = -o
mytest:test.c$(cc) $^ $(flag) $@
.PHONY:clean                                                                                                                                                                              
clean:rm -rf mytest

📝取消执行make指令时的回显

每次执行make指令,都会把对应的依赖方法回显出来,如下图:

我们只要在makefile文件中的依赖方法前面加上@,就可以取消回显。

CC = gcc
flag = -o
mytest:test.c@$(cc) $^ $(flag) $@
.PHONY:clean                                                                                                                                                                              
clean:@rm -rf mytest


🎁结语: 

     本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

相关文章:

『Linux升级路』基础开发工具——make/Makefile

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒…...

Python开发技能实战-如何在Visio中添加和删除任意连接点?

问题 在学习或者工作中,我们经常会借助Visio这个软件绘制流程图,在Visio中一般连接点是固定的,固定的连接点只能绘制一条连接线,如下图所示: 但有时候我们需要在两个方框之间绘制双向连接线,达到以下的效果…...

中科驭数受邀出席2023 ODCC冬季全会,共谋开放数据中心创新发展

近日,2023年开放数据中心委员会(简称“ODCC”)冬季全会在宁夏银川成功召开,中科驭数作为ODCC的新成员单位,受邀出席本次重要会议。 ▲ 中科驭数正式加入ODCC开放数据中心委员会 开放数据中心委员会是在中国通信标准化…...

Leetcode—907.子数组的最小值之和【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—907.子数组的最小值之和 算法思想 参考自y神思想 实现代码 class Solution { public:int sumSubarrayMins(vector<int>& arr) {long long ans 0;const int mod 1e97;int n arr.size();stack<int>…...

下载文件并重命名

//下载文件并重命名 // 无需数字化归档模版下载 function nodigitalMeth(){ let filenameunescape("/projectapp/ghsjy/template/noNeedDigital.docx")//原文件为英文名字 downloadFileRename(filename,"无需成果数据汇交模版") } // 需要数字化归档模版下…...

BGP路由的选路综合实验

题目要求 1.使用PreVal策略&#xff0c;确保R1通过R3到达192.168.10.0/24 2.使用AS_Path策略&#xff0c;确保R1通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R1通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保R4通过R2到达192.168.1.0/24…...

英语语法:连词or, and, if, unless怎么用?

连词or, and, if, unless怎么用&#xff1f;1. or conj. 或者&#xff0c;还是&#xff0c; 和&#xff0c; 否则用法&#xff1a;并列连词①当“或者&#xff0c;还是”讲时&#xff0c;用在选择疑问句中&#xff0c;是选择疑问句的标志例&#xff1a;Are you a teacher or a …...

基于Spring、SpringMVC、MyBatis的闪烁物业管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的闪烁物业管理系统,java项目。 …...

uni-app 离线打包安卓Apk(小白上手)

场景&#xff1a; 在使用uni-app 开发apk时&#xff0c;使用云打包有次数限制。尤其对于测试阶段是无比难受的&#xff0c;通常是浪费打包次数进行打包或者通过usb 给测试机更新开发环境&#xff0c;但这都是无比漫长的过程 尤其有多个测试机真的是噩梦般的存在 下载离线打包示…...

fatal: refusing to merge unrelated histories報錯咋辦

在 Git 中&#xff0c;如果要合并两个分支&#xff0c;而这两个分支的历史记录不相交&#xff0c;就会出现错误&#xff1a;fatal: refusing to merge unrelated histories。 要解决这个问题&#xff0c;有以下几种方法&#xff1a; 首先&#xff0c;检查一下你正在合并的两个…...

第二十二章 解读pycocotools的API,目标检测mAP的计算COCO的评价指标(工具)

Pycocotools介绍 为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集&#xff0c;用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi&#xff0c;这些api有助于在COCO中加载、解析和可视化注释。 …...

如何避免光模块接口受到污染?

光模块作为光通信领域一个重要的配件&#xff0c;实现光电和电光的转换&#xff0c;和光纤连接&#xff0c;承载了数据流量的快速转换与传输。因而在整个网络体系中&#xff0c;起着至关重要的作用。虽然光模块在使用过程中&#xff0c;不像交换机和服务器等网络设备一样需要经…...

虚拟机系列:Oracle VM VirtualBox虚拟机的使用教程和使用体验情况反馈

Oracle VM VirtualBox虚拟机的使用教程和使用体验情况反馈 一. 简述:二. 下载三. 安装解压后选择需要的版本点击安装1:第一步,点击安装,点击下一步2. 这里直接点击下一步,3. 网络警告选择:是4. 准备好以后,点击安装5. 点击完成即可四. 打开五. 创建虚拟机1. 输入虚拟机名…...

echarts 通用线性渐变堆叠面积图

echarts 通用线性渐变堆叠面积图 getLineData2() {const myChart echarts.init(this.$refs.chartDom);const option {tooltip: {trigger: axis,},legend: {show: false,textStyle: {fontSize: 14, //字体大小color: #ffffff, //字体颜色},data: [AAA, BBB],},grid: {show: tr…...

在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT

原创/朱季谦 本文分成两部分&#xff0c;包括【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】。 无论是在【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】&#xff0c;两个方式都需要魔法访问&#xff0c;否则是无法正常使用的&#xff0c;即…...

MYSQL基础知识之【索引】

文章目录 前言MySQL 索引普通索引创建索引修改表结构(添加索引)创建表的时候直接指定删除索引的语法唯一索引创建索引修改表结构创建表的时候直接指定使用ALTER 命令添加和删除索引使用 ALTER 命令添加和删除主键显示索引信息 后言 前言 hello world欢迎来到前端的新世界 &…...

工信部:1—10月我国软件业务收入98191亿元 同比增长13.7%

2023年1—10月份软件业经济运行情况 1—10月份&#xff0c;我国软件和信息技术服务业&#xff08;以下简称“软件业”&#xff09;运行态势平稳&#xff0c;软件业务收入较快增长&#xff0c;利润总额两位数增长&#xff0c;软件业务出口降幅持续收窄。 一总体运行情况 软件…...

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用?11.28晚八点虹科直播间为您揭晓!

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用&#xff1f;11.28晚八点虹科直播间为您揭晓&#xff01; 什么是AR眼镜&#xff1f; AR眼镜&#xff0c;即增强现实眼镜&#xff0c;是一种结合虚拟信息与真实世界的创新医疗工具。 通过集成高科技传感器和实时数据处理技术&…...

独乐乐不如众乐乐(二)-某汽车零部件厂商IC EMC企业规范

前言&#xff1a;该汽车零部件厂商关于IC EMC的规范可能是小编看过的企业标准里要求最明确的一份企业标准了&#xff0c;充分说明了标准方法不是死的&#xff0c;可以灵活应用。 先看看这份规范的抬头&#xff1a; 与其他企业规范一样&#xff0c;该汽车零部件厂商的IC EMC规范…...

每日汇评:黄金有望在美欧通货数据周回升至2020美元上方

金价在2000美元以上占据主导地位&#xff0c;巩固了其2018美元的六个月高点&#xff1b; 美元在避险情绪中暂停下跌&#xff0c;美债收益率小幅上升&#xff1b; 金价本周收于2000美元以上&#xff0c;在关键通胀数据公布之前将有更多涨幅&#xff1b; 黄金价格已经从周一亚洲早…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...