3.3、Linux项目自动化构建工具make/makefile

news2025/1/24 17:37:27

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

背景

依赖关系

依赖方法

实例代码

原理

项目清理


背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 再一个,我们平时使用的集成开发环境,创建一个工程项目,其中的源文件不计其数,哪个需要先编译,哪个需要后编译,哪个需要重新编译,都不需要我们操心,编译器都替我们做了,而makefile里这一系列操作都需要我们自己决定。
  • 但是,makefile有一个好处就是一但写好,只需要make命令整个工程自动编译,极大提高了编程效率。
  • make是一个命令工具,makefile是一个文件,make用来解释makefile,两者搭配使用,完成项目自动化构建。

依赖关系

比如我们有一个.c的文件,我们想要生成他的可执行程序,是不是要依赖这个文件?

依赖方法

我们知道了要生成这么一个可执行程序,需要依赖这个,c文件,那么如何通过这个文件生成可执行程序?这就需要依赖方法。

实例代码

原理

  1. make 会现在当前目录下寻找叫做makefile或者Makefile的文件,名字只能是这两者之一。
  2. 如果找到,那么他就会去找a.out这个文件,并将其作为最终的目标文件。
  3. 如果没有目标文件,就会根据依赖文件和依赖方法来生成这个文件。
  4. 在寻找过程中,如果找不到依赖文件,那么make报错终止并且就会直接退出,对于定义命令的错误,或是编译失败,或者直接就不理。

项目清理

先看举例代码:

我们会发现,编译一次后,再不允许编译,再看例子:

这一次,我们在对源文件修改后就可以编译了。

再编译,又不允许,我们就很好奇,系统是根据什么来判断是否让我们编译?

答案是时间,acm,访问文件时间,修改文件内容时间,修改文件属性时间,而且是通过比对源文件和可执行程序Modify时间

 

只要可执行程序的Modify时间比源文件的时间新,那么就说明我们对源文件查看或者修改过,而且未编译,此时就可以编译了。

 其余两个时间是不行的。

 但是我们还是有不修改源文件而只更新文件时间的命令。

touch命令,更新文件时间戳。

那么,在我们修改源文件后,有时候,因为源文件过多的原因,文件的修改时间可能没有修改,如果出现了无法编译的情况,那么我们就需要清理解决方案,也就是清理项目。

实际上,我们在进行编译的时候,没有生成目标文件,直接生成了可执行文件,在集成开发环境中,是会有各种临时文件生成的,当然,我们也可以用gcc 生成各种临时文件,但是博主懒。

补充: 

另外要提到的一点是伪文件,就是加了.PHONY: , 加上他以后,意思就是总是被执行,也就是说,我不管你时间是否修改,只要你命令,我就执行。

而且值得注意的是,make指令只会执行makefile中从上到下第一组依赖关系和依赖方法。如果我们的文件依赖列表中的文件找不到,就会向下去找,找到以后执行生成,再返回去执行。

$@就是目标,$^就是我们的依赖文件列表

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

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

相关文章

[量化投资-学习笔记006]Python+TDengine从零开始搭建量化分析平台-MACD

在上一章节介绍了 EMA 均线的计算,本节主要介绍均线的进化形态之一:MACD MACD (Moving Average Convergence / Divergence) 指数平滑移动平均线。MACD 是通过计算不同时间的 EMA 的差值俩判断价格趋势。 MACD 包括 3 个值: 长短期 EMA 差值…

信号上的串联电阻是如何改善信号质量的

一般我们在进行PCB设计时可能会留意到有些信号会串联一个电阻,那么大家是否有想过所串联的电阻是有什么作用呢? 大家可以看一下下面图示的案例,信号是从CPU处出来再接到DDR颗粒的,每一个DDR数据线都有串联一个电阻,其…

高速串行协议——Aurora

Aurora简介 Aurora 协议是一个用于在点对点串行链路间移动数据的轻量级链路层协议,并为物理层提供透明接口,让专有协议或业界标准协议上层能方便地使用高速收发器。 Aurora通信模型 在发送端,用户端应用程序可以通过AXI总线接口实现与Aurora…

虹科示波器 | 汽车免拆检测 | 2017款长安福特翼虎车发动机故障灯异常点亮

一、故障现象 一辆2017款长安福特翼虎车,搭载CAF488WQ9发动机,累计行驶里程约为8.9万km。该车因发动机故障灯异常点亮在其他维修厂检修,维修人员用故障检测仪检测,提示气缸3失火,调换火花塞、点火线圈及喷油器&#xf…

Sandcastle生成文档

下载: https://github.com/EWSoftware/SHFB/releases 使用Sandcastle生成Api文档需要使用对应程序集的注释xml 程序集dll作为数据源,通过对xml dll数据解析生成文档;所以主体步骤如下: 程序集资源生成创建配置.shfbproj项目编译构建文档 …

累计概率分布、概率分布函数(概率质量函数、概率密度函数)、度量空间、负采样(Negative Sampling)

这里写自定义目录标题 机器学习的基础知识累计概率分布概率分布函数度量空间负采样(Negative Sampling)基于分布的负采样(Distribution-based Negative Sampling):基于近邻的负采样(Neighbor-based Negativ…

【Linux进程】进程地址空间

目录 程序地址空间回顾 进程地址空间 宏观理解 谈细节 1、进程地址空间究竟是什么? 2、管理地址空间 3、页表 总结几个问题: 1、为什么要有进程地址空间? 2、进程切换 3、进程具有独立性,怎么做到的? 程序地…

C++程序崩溃时,使用Windbg静态分析dump文件

Window环境下的C程序如果发生异常崩溃,首先会和客户联系,让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话,从log一般分析不出特定原因,这时候dump文件就起作用了。可以通过Visual Studio和WinDbg来静态…

看看顶级外贸业务员是如何跟进客户的?

许多外贸业务员,都碰到过客户跟进上的困难。那到底外贸业务员如何跟进客户,才能越跟越近,最终成交呢?本篇文章设定了几个客户回复的场景,看看顶尖销售都是怎么应对的吧? 一 客户说暂时没有需求 1.问清楚客…

京东app地推拉新和京喜大赢家网推app拉新申请渠道 附全套攻略

京东app地推拉新和京喜大赢家网推拉新可以通过“聚量推客”申请 聚量推客是什么呢?一手官签服务商直营app拉新平台 京东app地推拉新项目和京喜大赢家网推拉新项目有什么区别呢? 京东app只能地推作业,京喜大赢家推广支持网推推广操作也更简…

【C语法学习】18 - fread()函数

文章目录 1 函数原型2 参数3 返回值4 示例 1 函数原型 fread():从与指定流stream相关联的二进制文件中读取数据块储存在str指向的内存空间中,函数原型如下: size_t fread(const void *ptr, size_t size, size_t count, FILE *stream)2 参数…

为什么大家都想找运营类的工作?

为什么大家都想找运营类的工作? 一、入门门槛 随着需求的持续增长,市场上的人员素质难以迅速匹配。在高校中,也难以培养出对口的应届毕业生。因此,许多企业在招聘运营人员时,更倾向于自行培养。对于新人的要求相对较低…

酒水展示预约小程序的效果如何

酒的需求度非常高,各种品牌、海量经销商组成了庞大市场,而在实际经营中,酒水品牌、经销商、门店经营者等环节往往也面临着品牌传播拓客引流难、产品展示预约订购难、营销难、销售渠道单一等痛点。 那么商家们应该怎样解决呢? 可以…

MTK RILD 无法启动问题分析

1、问题背景 Modem识别卡,但是UI无法识别卡,抓取问题机开机Log,发现RILJ一直在找寻RILD,但是无法获取相关服务,因此可以确认RILD Crash或出现异常。 但是在异常Log中搜索RILD,也未见相关关键字Log 2、对比实…

Springboot+vue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的导师双选管理系统,采用M(model&a…

享搭低代码平台:加速费用报销管理系统应用构建的利器

低代码平台的概念与优势 低代码平台是一种应用开发工具,它通过图形化界面和少量编码,使开发人员能够快速构建应用程序。它的优势包括提高开发效率、降低技术门槛、加强协作和灵活性等。 享搭低代码平台实现快速构建费用报销管理系统应用 在享搭低代码…

Web3.0的测试题

任务: 在前端开发一个查询UI,查询当前用户账户的ETH余额和指定ERC20合约中的余额 目标: UI框架指定使用 MUI (https://mui.com)需要查询到当前账户的ETH余额并展示在UI界面上需要输入ERC20合约地址后,查询到到当前账户在此ERC20…

【GEE】6、在 Google 地球引擎中构建各种遥感指数

1简介 在本模块中,我们将讨论以下概念: 如何在 GEE 中重命名图像的波段。如何使用已有的遥感指数。如何使用波段数学生成自己的遥感指数。 一个田地已经灌溉的年数的卫星图像。灌溉水最可能的来源是奥加拉拉含水层。图片来自科罗拉多州霍利奥克附近。资料…

测试开发路线大纲与总结

一、什么是测试开发? 测试开发(Test Development)是一种结合软件测试和软件开发的角色和实践。测试开发人员负责设计、开发和维护自动化测试工具、测试框架和测试脚本,以支持测试流程的自动化和优化。他们与开发团队和质量保证&a…

云尘靶场 Medium_Socnet 内网为docker 无站代理 不存在gcc的提权方式 解决ldd过高无法执行exp 指定so文件

首先我们可以通过 arp-scan 扫描当前内网中的存活 但是不知道为什么扫不出来 然后我们使用fscan可以获取存活 这里大致扫描只开了22端口 所以我们使用nmap进行信息收集扫描 nmap -sS -sV -A -p- 172.25.0.13通过tcp 进行 版本服务扫描 并且检测系统版本 全端口 这里我们可以…