003 linux 自动化构建工具-make/makefile

前言

本文将会向您介绍make/makefile的原理与操作

引入

首先先向您介绍linux的编译器gcc的编译过程:
预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

编译(生成机器可识别代码)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
gcc –S hello.i –o hello.s

汇编
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

链接
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello

Makefile

一个工程里的源文件不计数,其按类型,功能,模块,分别放在若干目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于更复杂的功能操作
makefile带来的好处好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率

make是如何工作的,在默认的方式下,也就是我们只输入make命令。
首先你应该有一个.c的源文件
在这里插入图片描述

然后我们再touch一个名为Makefile的文件
在这里插入图片描述
在文件中写入以下代码
在这里插入图片描述
最后我们进入底行模式wq保存退出
我们先操作一番看一下结果
输入make
在这里插入图片描述
查看生成的可执行程序
在这里插入图片描述
这时就会多出来一个我们命名的可执行程序
然后再./mybin运行
在这里插入图片描述
最后输入make clean
在这里插入图片描述
这时我们的可执行程序就被清理掉了
解析:

mybin:code.c
依赖关系: 上面的文件mybin,它依赖code.c
tips:依赖关系是指一个程序或模块需要使用另一个程序或模块的功能或资源。依赖关系可以是源代码级别的依赖,也可以是编译时或运行时的依赖。
gcc code.c - o mybin
使用gcc将名为code.c的c源文件编译成为一个名为mybin的可执行文件
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mybin”这个文件,并把这个文件作为最终的目标文件。
.PHONY:clean
声明一个名为"clean"的伪目标。通过声明为伪目标,可以告诉Make工具,"clean"目标不对应任何实际的文件,而是用于执行清理操作
clean目标用于删除生成的可执行文件。当运行"make clean"命令时,Make工具将会执行clean目标下的命令,即rm -f mybin,来删除"mybin"文件 tips:在Makefile中,.PHONY是一个特殊的目标,用于声明一个伪目标,伪目标是一种特殊的目标,它并不对应任何实际的文件,而是用于定义一些特殊的操作或命令。 当在Makefile中使用@符号时,后面的命令将不会被打印到标准输出中。这样可以隐藏命令的执行过程,使输出更加简洁。
   mybin:code.c@gcc code.c -o mybin@echo "编译成功...".PHONY:cleanclean:@rm -f mybin@echo "清理成功..."

在这里插入图片描述

make会在当前目录下找名字叫“Makefile”或“makefile”的文件
然后用vim打开Makefile文件

//变量话处理
cc=gcc
src=code.c
target=mybintarget:$(src)@$(cc) $(src) -o $(target)@echo "编译成功..."
PHONY:clean
clean:@rm -f $(target)@echo "清理成功..."
其中 $ 符号用于引用变量。我们可以方便地引用当前规则的目标文件,使规则更加通用和可维护。

在这里插入图片描述

我们也可以用$ ^代替冒号右侧的源文件,用$@冒号左侧的目标文件

mybin:code.ogcc code.o -o mybin
code.o:code.sgcc -c code.s -o code.o
code.s:code.igcc -S code.i -o code.s
code.i:code.cgcc -E code.c -o code.i
.PHONY:clean
clean:rm -f mybin code.o code.s code.i

这里就对应本文刚开始的引入gcc的选项
如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
在这里插入图片描述
当我们make的时候,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。

当我们重复make的时候,makefile识别到目前的文件是没有作修改的,因此不用重复编译

在这里插入图片描述

文件的ACM时间

我们不能重复make的原因是
Access该文件的最近访问时间
Modified对内容进行修改的时间
change对文件的属性修改的时间
在这里插入图片描述
我们可以用stat命令获取文件的ACM时间
在这里插入图片描述
可以观察到每次make后,可执行程序mybin的ACM时间就被更新了,且晚于源文件的时间
因此再次make的时候,操作系统会提醒我们mybin是最新的
在这里插入图片描述
当我们重复的make clean的时候,这件事却被允许了,why?
.PHONY是一个特殊的目标。它用于定义一个伪目标(即不存在对应的文件),并且告诉make工具这个目标不需要检查依赖关系,总是需要执行

小结

本文的分享就到这里啦,如果本文存在疏漏或错误的地方还请您能够指出!

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

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

相关文章

iOS线上闪退问题解决方案

iOS线上闪退问题的收集工具是关键,它们可以帮助你及时发现和解决应用程序中的崩溃问题。以下是一些常用的iOS线上闪退问题收集工具及其使用方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合…

3.wifi开发,网络编程

网络协议栈LwIP WiFi UDP Clinet编程 WiFi UDP Server编程 WiFi TCP Client编程 WiFi TCP Server编程 一。LWIP原理介绍,API介绍,文件结构 1.Lwip支持的协议 2.API 3.文件结构 1.api目录:应用程序接口文件。 2.arch目录:与硬件和…

机器学习笔记:Huber Loss

1 介绍 Huber Loss是回归问题中的一种损失函数,它结合了均方误差MSE和绝对误差MAE的特点。 Huber Loss在误差较小的时候是平方损失,而在误差较大的时候是线性损失。因此,它在处理有噪声的数据时,尤其是存在离群点的情况下&#x…

nginx反向代理vue项目

文章目录 前言一、创建站点1.添加站点2.添加ssl证书 二、反向代理vue项目1.添加反向代理2.更改vue项目配置3.修改反向代理配置 前言 项目描述:前端vue项目、后端Java项目、首页WordPress项目 客户要求:使用宝塔进行部署 需求描述:客户只有一…

一文彻底理解synchronized(通俗易懂的synchronized)

目录 一、什么是synchronized 二、synchronized的四种用法 2.1、修饰一个代码块 2.2、修饰一个方法 2.3、修饰一个静态的方法 2.4、修饰一个类 三、使用案例分析 3.1、修饰一个代码块 3.2、修饰一个方法 3.3、修饰一个静态的方法 3.4、修饰一个类 3.5 经典用法&…

蓝桥杯 题库 简单 每日十题 day8

01 扫雷 题目描述 在一个n行列的方格图上有一些位置有地雷,另外一些位置为空。 请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。 输入描述 输入的第一行包含两个整数n,m。 第2行到第n1行每行包含m个整数,相邻整…

Winform直接与Wpf交互

Winform项目中,可以直接使用wpf中的自定义控件和窗体 测试环境: vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下: 1 新建winfrom项目,名为WinFormDemo,默认有一个名为Form1的窗体…

关于表单快速开发低代码技术平台的内容介绍

运用什么样的表单快速开发软件平台可以实现高效率创收?随着科技的进步和飞速发展,专业的低代码技术平台已经走入了很多企业的办公职场中,它们灵活、轻量级、优质、高效、易维护等优势特点,可以高效助力广大企业提质增效&#xff0…

位移贴图的实现原理

在以前的文章中介绍过GLTF编辑器 , 编辑器可以对模型的各种材质纹理进行编辑修改,但是有一些新手用户可能对这些材质纹理不太了解,所以我收集了一些资料对这些材质纹理做一下详细的介绍,今天这篇文章主要是介绍位移贴图。 1、什么…

stm32之智能垃圾桶实战

之前用过51做过一个垃圾桶的小项目,这里用32重新搞了一下。视频的效果和之前一样,可参考这个垃圾桶效果 。 一、项目描述(同51) 项目主要是模拟不用手动打开垃圾桶盖,而进行自动操作。自动打开的条件如下&#xff1a…

【二叉树魔法:链式结构与递归的纠缠】

本章重点 二叉树的链式存储二叉树链式结构的实现二叉树的遍历二叉树的节点个数以及高度二叉树的创建和销毁二叉树的优先遍历和广度优先遍历二叉树基础oj练习 1.二叉树的链式存储 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑…

点云从入门到精通技术详解100篇-单期点云的高斯曲率定位桥梁潜在损伤技术研究

目录 前言 国内外研究现状 三维激光扫描对桥梁损伤检测的研究现状 基于点云高斯曲率损伤检测的研究现状 柱体偏差检测技术研究现状 存在的问题 法向量约束高斯曲率的 TLS 桥面潜在损伤区域探测 2.1 高斯曲率探伤的基本理论 2.2 点云拓扑关系建立的方法比较 2.2.1 KD-…

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司(以下简称为“云帐房”)成立于2015年3月,以“成为最值得信赖的税务智能公司”为愿景,运用人工智能、大数据等互联网技术,结合深厚的财税行业服务经验,为代账公司和中大型企业提供智能…

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血,占全部脑卒中发病率的10-15%。其病因复杂,通常因脑动脉瘤破裂、脑动脉异常等因素,导致…

黑马JVM总结(十九)

(1)GC调优1 通过官网查看查看JVM的参数: 可以使用java命令查看当前环境下的虚拟机参数: 学会使用一些工具如前面学的jmap ,jconsole等等工具 (2)GC调优2 垃圾回收调优只是众多调优中的一个方…

读高性能MySQL(第4版)笔记14_备份与恢复(中)

1. 在线备份 2. 离线备份 2.1. 关闭MySQL做备份是最简单、最安全的 2.2. 所有获取一致性副本的方法中最好的 2.3. 损坏或不一致的风险最小 2.4. 根本不用关心InnoDB缓冲池中的脏页或其他缓存 2.5. 不需要担心数据在尝试备份的过程中被修改 2.5.1. 服务器不对应用提供访问…

【动态规划刷题 17】回文子串 最长回文子串

647. 回文子串 链接: 647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由…

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…

Learn Prompt-GPT-4:能力

GPT-4能力大赏​ 常识知识推理​ 一个猎人向南走了一英里,向东走了一英里,向北走了一英里,最后回到了起点。他看到了一只熊,于是开枪打了它。这只熊是什么颜色的? 答案是白色,因为这种情况只可能发生在北…

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…