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

news2024/10/3 3:14:56

前言

本文将会向您介绍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:clean
 clean:
       @rm -f mybin
       @echo "清理成功..."

在这里插入图片描述

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

//变量话处理
cc=gcc
src=code.c
target=mybin

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

在这里插入图片描述

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

mybin:code.o
         gcc code.o -o mybin
code.o:code.s
         gcc -c code.s -o code.o
code.s:code.i
         gcc -S code.i -o code.s
code.i:code.c
         gcc -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.coloradmin.cn/o/1033519.html

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

相关文章

iOS线上闪退问题解决方案

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

POJ 3977 Subset 折半枚举+二分搜素+双指针

一、题目大意 我们有N&#xff08;N<35&#xff09;个元素&#xff0c;从中选取一个子集&#xff0c;使得它的元素求和的绝对值最小&#xff0c;如果有多个可行解&#xff0c;选择元素最小的。 输出最优子集的元素总和绝对值&#xff0c;和最优子集元素的数量。 二、解题…

Google拟放弃博通自行研发AI芯片 | 百能云芯

谷歌计划自行研发人工智能&#xff08;AI&#xff09;芯片&#xff0c;考虑将博通&#xff08;Broadcom&#xff09;从其供应商名单中剔除&#xff0c;但谷歌强调双方的合作关系不会受到影响。 根据美国网络媒体《The Information》的报道&#xff0c;谷歌高层正在讨论可能在20…

窜货采买第三方怎么选择

窜货溯源服务听起来并不难&#xff0c;无非就是买货&#xff0c;但是否能买到货&#xff0c;同时在买到之后能否顺利完成溯源工作&#xff0c;也是非常有学问的&#xff0c;很多品牌会选择第三方服务商进行采买合作&#xff0c;这样可以规避品牌自己操作时的不合规性&#xff0…

Exploit-DB 使用小结

Exploit-DB &#xff08;网址&#xff1a;https://www.exploit-db.com&#xff09; 是一个漏洞库网站 &#xff0c;存储了大量的漏洞利用程序&#xff0c;可以帮助安全研究者和渗透测试工程师更好的进行安全测试工作&#xff0c;目前是世界上公开收集漏洞最全的数据库&#xff…

CNN(八):Inception V1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 Inception V1 Inception v1论文 1.1 理论知识 GoogLeNet首次出现在2014年ILSVRC比赛中获得冠军。这次的版本通常称其为Inception V1。…

QtCreator报大量未知标识符错误的解决方法

目录 前言背景介绍问题1问题1解决方法问题2问题2 解决方法总结 前言 本文记录了在使用QtCreator开发时遇到的一个错误&#xff0c;导致编译时出现大量的“未知标识符”&#xff0c;经过一番努力最终解决了这个问题&#xff0c;特在此记录。 背景介绍 Qt项目在麒麟V10 系统下…

Linux中创建用户要自己设置密码

因为不知道Linux默认设置的密码&#xff0c;没办法接下来愉快的使用。如下&#xff1a; 而想要新建Linux用户密码&#xff0c;请您执行以下步骤: . 1.打开终端并以root身份登录; 2.输入命令“useradd username",其中username为您新建的用户名; 3.使用命令“passwd usernam…

《向量数据库指南》——向量搜索库Faiss 迁移到 Milvus 2.x

Faiss -> Milvus 2.x 1. Faiss 数据准备 前提条件是用户已经准备好了自己的 faiss 数据文件。(为了能快速体验,在项目源码的 testfiles 目录下放置了 faiss 测试数据方便用户体验: faiss_ivf_flat.index. 2. 编译打包 这部分同上,不再展开介绍。 3. 配置 migration.ymal…

【数据结构】顺序查找,折半查找,分块查找的知识点总结及相应的代码实现

目录 1、顺序查找 定义及步骤 代码实现 2、折半查找 定义及步骤 代码实现 折半查找判定树 3、分块查找 定义及步骤 1、顺序查找 定义及步骤 顺序查找的定义&#xff1a;从数据集合的起始位置开始&#xff0c;逐一比较每个数据元素&#xff0c;直到找到所要查找…

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cn SEO不稳定是指网站在搜索引擎中的排名不稳定&#xff0c;随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此&#xff0c;优化SEO非常重要&#xff0c;可以提高网站…

4+机器学习+实验验证

今天给同学们分享一篇4机器学习实验验证的生信文章“Identification and Analysis of Neutrophil Extracellular Trap-Related Genes in Osteoarthritis by Bioinformatics and Experimental Verification”&#xff0c;这篇文章于2023年8月31日发表在 J Inflamm Res 期刊上&am…

两个数使用JavaScript比较大小;JavaScript知识点

一、两个数使用JavaScript比较大小代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">var aprompt("请输入第一个数:"…

Web自动化测试 —— 如何进行Selenium页面数据及元素交互?啊哈

前言&#xff1a; Web自动化测试是一种常用的测试方式&#xff0c;通过在浏览器中模拟用户操作以及与页面元素的交互&#xff0c;可以有效地检验页面的功能性以及稳定性。Selenium是一款流行的Web自动化测试工具&#xff0c;在本篇文章中&#xff0c;我们将介绍如何使用Seleni…

青大数据结构【2022】

关键字&#xff1a; next数组、下三角矩阵、完全二叉树结点、静态分布动态分布、迪杰斯特拉最短路径、二叉排序树失败ASL、排序比较、二叉排序树中序遍历、链表删除最大值 一、单选 二、简答 三、应用 四、算法分析 五、算法设计

nginx反向代理vue项目

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

【Java】Servlet API

Servlet API HttpServlet核心方法Servlet生命周期 HttpServletRequest核心方法 HttpServletResponse核心方法 HttpServlet 我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法. 核心方法 方法名称调用时机init在 HttpServlet 实…

李宏毅机器学习第一课

机器学习就是让机器找一个函数f&#xff0c;这个函数f是通过计算机找出来的 如果参数少的话&#xff0c;我们可以使用暴搜&#xff0c;但是如果参数特别多的话&#xff0c;我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification &#xff08;在…

美团2024届秋招笔试第一场编程[汇总](上课口胡一下)

一.小美的好矩阵 口胡&#xff1a;模拟题&#xff0c;数据和题意灰常清楚。 俩层循环枚举每个3&#xfe61;3的小矩阵&#xff0c;然后枚举每个小矩阵&#xff0c;12个if判断俩俩相邻的字符是否相等。这里有个技巧&#xff1a;拿出中间的字符&#xff0c;这样就能使用一个偏移…

基于紫光同创FPGA的图像采集及AI加速

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL50H开发平台&#xff08;盘古50K开发板&#xff09; 本篇优秀作品&#xff1a;2023集创赛全国总决赛紫光同…