『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


🎁结语: 

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

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

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

相关文章

EM32DX-C1【分布式io】

1设备类型: 电压:DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块,具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法,可以用于检测图像中的人行道-斑马线。在目标检测领域,YOLOv5通过结合多种技术手段,包括使用Mosaic数据增强操作、自适应锚框计算与…

SDN之Ubuntn20.04OpenDaylight控制器的安装

目录 1.OpenDaylight简介2.安装JAVA环境3.安装OpenDaylight4.问题总结 1.OpenDaylight简介 OpenDaylight(ODL)是一个开源的软件定义网络(SDN)控制器平台,提供了非常美观且功能完善的可视化管理界面,方便用…

15.解释Spring支持的几种bean的作用域

Spring支持的几种bean的作用域 Spring框架支持以下五种bean的作用域: singleton : bean在每个Spring ioc 容器中只有一个实例。prototype:一个bean的定义可以有多个实例。request:每次http请求都会创建一个bean,该作用域仅在基于…

redis Redis::geoAdd 无效,phpstudy 如何升级redis版本

redis 查看当前版本命令 INFO SERVERwindows 版redis 进入下载 geoadd 功能在3.2之后才有的,但是phpstudy提供的最新的版本也是在3.0,所以需要升级下 所以想出一个 挂狗头,卖羊肉的方法,下载windows 的程序,直接替…

桥梁道路结冰传感器守护出行安全的重要工具

随着冬季的到来,气温逐渐降低,路面和桥梁容易结冰,给人们的出行带来安全隐患。为了解决这一问题, WX-JB2H 桥梁道路结冰传感器应运而生。本文将详细介绍桥梁道路结冰传感器的作用、原理及在冬季出行中的重要性。 一、桥梁道路结冰…

14.配置Bean有哪几种方式?

配置Bean有哪几种方式? 基于xml: <bean class=“com.tuling.UserService” id=“”>基于注解: @Component(@Controller 、@Service、@Repostory) 前提:需要配置扫描包<component-scan> 反射调用构造方法基于java类配置: @Bean 可以自己控制实例化过程@Import 3种…

flink源码分析之功能组件(三)-rpc组件

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。 本文解释rpc组件,rpc组件用于个核心组件,包括作业管理器,资源管理器和任务管理器之…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

iOS移动应用程序的备案与SHA-1值查看

​ 目录 &#x1f4dd;iOS移动应用程序的备案与SHA-1值查看 引言 第一部分&#xff1a;App备案 第二部分&#xff1a;查看SHA-1值 引言 在开发和发布移动应用程序时&#xff0c;进行App备案是非常重要的一步&#xff0c;它是确保您的应用在合规性方面符合相关法规的过程。…

glibc和gcc源码

glibc下载 $ git clone git://sourceware.org/git/glibc.gitgcc编译器&#xff0c;https://gcc.gnu.org/ git clone git://gcc.gnu.org/git/gcc.git

2023-11-27 LeetCode每日一题(子数组的最小值之和)

2023-11-27每日一题 一、题目编号 907. 子数组的最小值之和二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff…

记一次处理大数据而导致的内存溢出问题

问题 订单服务通过MQ进行订单同步时&#xff0c;刚启动可以正常消费&#xff0c;但是跑一会就会卡住&#xff0c;每次都是第8个kafka分区不行再进行消费&#xff0c;其他分区消费的很慢。 现象 首先&#xff0c;CPU超高&#xff0c;达到百分之300多&#xff1b;其次&#xf…

2023年双十二超声波清洗机如何选?有哪些值得购买的超声波清洗机?

通过眼科医院对近视眼统计报告说明&#xff0c;截止2023年3月27日&#xff0c;全国近视眼人数为3亿人&#xff0c;其中青少年近视约为2亿人&#xff0c;现在大部分人都离不开眼镜&#xff0c;也有很多人忽视了清洗眼镜的重要性&#xff0c;眼镜长时间的不清洗的话会很容易导致脸…

【实战教程】PHP与七牛云的完美对接

前言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的网站和应用程序需要处理大量的图片、视频和其他文件。为了有效地存储和管理这些文件&#xff0c;并提供快速的内容分发服务&#xff0c;开发者们常常依赖于云存储和CDN服务提供商。 七牛云是一家领先的云存储和C…

2023华为ICT网络初赛试题回顾

所有题目都只能用来学习交流&#xff0c;禁止用于非法不公平的使用&#xff0c;如有侵权&#xff0c;该文章立刻删除。 1、某机房没有合适长度的网线&#xff0c;现需手工制作一个568B标准的双纹线&#xff0c;那么应按照以下哪一线序进行制作? A.绿白,绿&#xff0c;蓝&#…

想要对网站进行安全监测,安全SCDN效果怎么样?

随着互联网的迅速成长&#xff0c;各种网站出现的越来越多&#xff0c;个人网站、企业网站等&#xff0c;同时网站竞争也越来越强。随着用户对网站需求增多&#xff0c;对网站的安全也愈发受到人们的重视。那么我们日常网站运营中&#xff0c;有需要对网站进行安全监控&#xf…

dbeaver 中如何set define off

窗口-首选项-编辑器-SQL编辑器-SQL处理-参数- 勾选“启用SQL参数”---set define on 取消勾选“启用SQL参数”---set define off

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator &#xff08;MBG&#xff09; 是 MyBatis 的代码生成器。它能够根据数据库表&#xff0c;自动生成 java 实体类、dao 层接口&#xff08;mapper 接口&#xff09;及m…

[个人笔记] Linux facl扩展权限的用法

Linux - 运维篇 第五章 Linux facl扩展权限的用法 Linux - 运维篇系列文章回顾Linux facl扩展权限的用法练习 参考来源 系列文章回顾 第一章 Linux扩容LVM分区 第二章 Linux虚拟机安装VMware Tools插件 第三章 ssh-keygen和openssl工具的使用 第四章 Linux配置NTP时间同步 Lin…