【Day9】make/makeFile如何让项目构建自动化起飞

【Day9】make/makeFile如何让项目构建自动化起飞

  • 使用make命令
  • 编写makefile文件
    • 依赖管理
    • 增量构建
    • makefile注释:#
    • makefile其他语法
  • make/makefile递归式工作过程

在Linux中,项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和部署等过程。

make和makefile是linux中常用的项目自动化构建工具。make是一条命令,makefile/Makefile是一个文件。两个搭配使⽤,完成项目自动化构建。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些源文件需要先翻译,哪些源文件需要后翻译,哪些源文件需要重新翻译,甚至于进行更复杂的功能操作。make是一个命令工具,是一个解释makefile中指令的命令工具。

在makefile中写好构建步骤,再用make命令启动makefile,整个工程完全“自动化编译”,能极大提高软件开发的效率。

使用make命令

makefile文件的位置:和源文件在同一目录下。

总结make的用法:
make 目标文件:在当前目录下找makefile文件,扫描makefile,并执行目标文件。

make:make命令中如果没有指定目标文件,make命令默认从上往下依次扫描makefile中的内容,默认扫描到的第一个目标文件作为本次要执行的目标文件。

编写makefile文件

依赖管理

一个项目中的源文件之间可能存在各种依赖关系,例如一个源文件可能依赖于其他源文件或头文件,Makefile 明确地定义这些依赖关系(目标(target)、依赖(prerequisites)和规则(rules)),确保在编译时按照正确的顺序进行处理,避免因依赖关系错误导致的编译错误。
例如:
在下面这个makefile文件中,
第一行是依赖关系,第二行是依赖方法。根据依赖关系执行依赖方法
在这里插入图片描述在依赖关系中,目标文件依赖的源文件可以不写明。
用.PHONY修饰的目标文件,表示这个目标文件是一个伪目标。伪目标的特点是伪目标对应的依赖关系和依赖方法总是被执行。也就是,只要makefile中有下面3、4、5行内容,只要make,目标文件对应的依赖方法被执行的同时,3、4、5行内容是一定会执行的。
3、4、5行的意思是清除所有生成的目标文件。
在这里插入图片描述

增量构建

全量构建:在目标文件和对应的所有依赖文件中,哪怕只有一个文件被修改过,再次make目标文件的时候,对应的所有依赖文件都要重新编译然后链接。
增量构建:再次make目标文件的时候,Makefile 会检查文件的修改时间,如果依赖文件比目标文件更新,就重新编译这个依赖文件。
在这里插入图片描述

伪目标对应的依赖关系和依赖方法总是被执行,总是被执行即忽略对比modify时间。

例如:
在这里插入图片描述
在这里插入图片描述
自己的程序不建议使用.PHONY修饰。
什么叫做不被执行?
场景:假设一个可执行程序依赖了100个源文件,但如果此时我们对其中一个源文件做出了修改,我们并不需要重新编译所有源文件。
只有make伪目标文件的时候,伪目标对应的依赖关系和依赖方法才总是被执行。
该可执行程序不是伪目标文件,所以gcc在重新编译时,老代码没被修改过且是不被执行的,不会被重新编译,gcc只会把修改过的代码重新编译下。

make命令怎么知道:二进制文件(依赖文件被编译成.o文件)和源文件(目标文件的依赖文件)哪个修改时间更新呢?
通过文件的Modify属性判断。Modify属性是文件/目录的内容最后一次被修改的时间。可以使用stat命令查看文件/目录的详细信息。

makefile注释:#

在这里插入图片描述

makefile其他语法

Makefile 支持变量、条件判断、函数和外部脚本调用,可以灵活扩展构建逻辑。

例如:

BIN=proc.exe  # 定义变量
CC=g++ 
SRC=myproc.c 
OBJ=myproc.c
LFLAGS=-o
FLAGS=-c.PHONY:test 
test: @echo $(SRC) # 命令前面加@,表示make的时候只显示结果,不回显命令echo $(CC) # $(CC):最开始我们定义了变量CC,此时$(CC)等价gcc。$()的意思是把此处内容替换成括号里的$(BIN):$(SRC)@$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名,此时相当于$(BIN)。 $^: 代表依赖⽂件列表,此时相当于$(SRC)@echo "linking ... $^ to $@"# 依赖文件不止一个时可以像下面这样写:
%.o:%.c              #  %相当于makefile中的通配符$(CC) $(FLAGS) $<  #  $<的意思是对匹配到的.c文件,依次交给gcc@echo "compling ... $^ to $@"SRC1=$(shell ls *.c)   # 在makefile中可以直接使用linux命令,方法是`shell 命令`。所以这句的意思是显示所有.c文件,并把它们放到SRC1中。SRC2=$(wildcard *.c) # makefile内部也有函数,其中函数wildcard的功能是获取符合特定模式的文件名列表。所以`wildcard *.c`的意思是获取当前所有后缀是.c的⽂件。SRC3=$(SRC:.c=.o)  # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 

make/makefile递归式工作过程

目录中存在myproc.c文件。
以下面内容为例展示makefile的工作过程:

myproc:myproc.o gcc myproc.o -o myproc
myproc.o:myproc.s gcc -c myproc.s -o myproc.o
myproc.s:myproc.i gcc -S myproc.i -o myproc.s
myproc.i:myproc.cgcc -E myproc.c -o myproc.i.PHONY:clean 
clean: rm -f *.i *.s *.o myproc

通过make命令执行makefile后,(默认只输⼊make命令),则:

  1. make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。
  2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到 myproc 这个⽂件,并把这个⽂件作为最终的⽬标⽂件。
  3. 如果 myproc ⽂件不存在,或是 myproc 所依赖的后⾯的 myproc.o ⽂件的⽂件修改时间要⽐ myproc 这个⽂件新,那么,他就会执⾏后⾯所定义的命令来⽣成
    myproc 这个⽂件。
  4. 如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为
    myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。makefile工作时会维护一个类似于栈的东西
  5. 依次类推(相当于进栈过程)。
  6. 当前目录下存在myproc.c文件,经过编译后make 会⽣成myproc.i ⽂件(相当于出栈过程)。最终,make 会⽣成myproc.o ⽂件,然后myproc.o ⽂件编译后,形成最终的目标文件myproc。
  7. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个⽬标⽂件。
  8. 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并报错。make只管⽂件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对不起,我就不⼯作啦。对于其他错误,make根本不理。

在这里插入图片描述


下次见~

在这里插入图片描述

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

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

相关文章

验证测试 .NET 10 预览版的 Windows 窗体中的剪贴板新增功能

前言 在 .NET 10 中&#xff0c;Windows Forms 对剪贴板功能进行了更新&#xff0c;引入了新的 API 以提高类型安全性和避免使用 BinaryFormatter 带来的安全风险。 安装SDK 首先访问.NET 10.0.0-preview链接&#xff0c;下载.NET 10.0.0-preview.1版本SDK&#xff0c;然后…

攻防世界WEB(新手模式)19-file_include

先进行代码分析 include("./check.php");&#xff1a;包含并执行当前目录下的check.php文件&#xff0c;通常用于引入一些通用的函数、类或配置信息。if(isset($_GET[filename]))&#xff1a;检查是否通过 GET 请求传递了名为filename的参数。如果传递了filename参数…

基础算法总结

基础算法总结 1、模拟1.1 什么是模拟算法1.2 算法题1.2.1 多项式输出1.2.2 蛇形方阵 2 高精度算法2.1 什么是高精度算法2.2 算法题2.2.1 高精度加法 2.2.2 高精度乘法 3 普通枚举3.1 算法题3.1.1 铺地毯 3.1.2 回文日期 4 前缀和算法4.1 什么是前缀和4.2 算法题4.2.1 最大子段和…

【摸鱼指南】--- VSCode 使用 Thief-Book 隐形阅读模式配置教程 程序员必备插件

在代码的理性森林里&#xff0c;摸鱼是调试生活的快捷键 —— 我们用Coffee Break的灵感碎片&#xff0c;编译出更高效率的人生程序真正的效率大师&#xff0c;从不在单一线程里耗尽人生 —— 我们在主进程敲打代码&#xff0c;却在后台线程编译星辰大海 【摸鱼指南】--- VSCod…

5分钟速览深度学习经典论文 —— attention is all you need

《Attention is All You Need》是一篇极其重要的论文&#xff0c;它提出的 Transformer 模型和自注意力机制不仅推动了 NLP 领域的发展&#xff0c;还对整个深度学习领域产生了深远影响。这篇论文的重要性体现在其开创性、技术突破和广泛应用上&#xff0c;是每一位深度学习研究…

苹果商店上架流程,app上架发布流程

苹果商店地址 https://appstoreconnect.apple.com/login 其他地址:开发 - Apple Developer 1.更新代码 将项目的代码更新到最新,更新成功后右下角会给出提示 2.打开模拟器 鼠标右键可以选择设备(Device) 3.测试运行 如下图可以看到已经识别到设备了,点击运行即可,运行到模…

六十天前端强化训练之第十天之DOM操作基础

欢迎来到编程星辰海的博客讲解 目录 一、DOM核心概念 1.1 DOM树结构 1.2 节点类型 1.3 节点关系 二、基本DOM操作 2.1 元素选择 2.2 元素创建/修改 2.3 节点操作 三、事件处理机制 3.1 事件流三个阶段 3.2 事件绑定 3.3 事件对象 四、动态表格案例 4.1 核心代码 …

C# 开发工具Visual Studio下载和安装

开发环境与工具 C#的主要开发环境是Visual Studio&#xff0c;这是一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑、调试、项目管理、版本控制等功能。此外&#xff0c;Visual Studio Code也是一个轻量级的跨平台代码编辑器&#xff0c;支…

linux 系统内核查询

1. 使用uname命令 uname命令可以用来显示系统信息&#xff0c;包括内核版本。 查看完整的内核版本信息&#xff1a;uname -a [rootlocalhost ~]# uname -a Linux localhost.localdomain 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GN…

Matlab实现车牌识别

车牌识别技术作为现代智能交通系统、安防监控以及诸多车辆管理应用场景中的关键环节&#xff0c;正发挥着日益重要的作用&#xff0c;它能够自动、快速且精准地从车辆图像或视频流中提取车牌信息&#xff0c;实现车辆身份的智能化识别。 技术原理 车牌识别主要依托于图像处理、…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器&#xff0c;支持超过80种编程语言的高亮显示&#xff0c;相比系统自带记事本具有以下优势&#xff1a; 轻量高效&#xff1a;启动速度比同类软件快30%插件扩展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题

文章目录 问题背景初始测试与问题发现LLaMA Factory测试结果对照实验:Ollama测试系统性排查与解决方案探索1. 尝试更换模板2. 深入研究官方文档3. 自定义模板实现优化界面展示:实现思考过程的可视化实现方法参数调整影响分析实验一实验二🎉进入大模型应用与实战专栏 | 🚀…

从零开始在Windows使用VMware虚拟机安装黑群晖7.2系统并实现远程访问

文章目录 前言1.软件准备2. 安装VMware17虚拟机3.安装黑群晖4. 安装群晖搜索助手5. 配置黑群晖系统6. 安装内网穿透6.1 下载cpolar套件6.2 配置群辉虚拟机6.3 配置公网地址6.4 配置固定公网地址 总结 前言 本文主要介绍如何从零开始在Windows系统电脑使用VMware17虚拟机安装黑…

康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术

随着自动驾驶技术的迅猛发展&#xff0c;构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下&#xff0c;3D高斯点阵渲染&#xff08;3DGS&#xff09;技术应运而生&#xff0c;成为自动驾驶仿真场景重…

WPS AI+office-ai的安装、使用

** 说明&#xff1a;WPS AI和OfficeAI是两个独立的AI助手&#xff0c;下面分别简单讲下如何使用 ** WPS AI WPS AI是WPS自带AI工具 打开新版WPS&#xff0c;新建文档后就可以看到菜单栏多了一个“WPS AI”菜单&#xff0c;点击该菜单&#xff0c;发现下方出现很多菜单&#xf…

MacOS Big Sur 11 新机安装brew wget python3.12 exo

MacOS Big Sur 11,算是很老的系统了&#xff0c;所以装起来有点费劲。 首先安装brew 按照官网的方法&#xff0c;直接执行下面语句即可安装&#xff1a; export HOMEBREW_BREW_GIT_REMOTE"https://githubfast.com" # put your Git mirror of Homebrew/brew here …

python-leetcode-一和零

474. 一和零 - 力扣(LeetCode) 这道题是一个典型的 0-1 背包问题,需要用动态规划(DP)来求解。 解题思路 1. 定义状态 设 dp[i][j] 表示最多有 i 个 0 和 j 个 1 时,可以获得的最大子集的大小。 2. 状态转移方程 对于 strs 中的每个字符串 s: 计算 s 中 0 和 1 的个数…

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…

安卓免费工具:海量素材助力个性化头像制作

软件介绍 今天要给大家介绍的软件是DIY头像生成&#xff0c;这是一款超有创意的头像制作工具&#xff0c;可在安卓系统使用&#xff0c;而且它完全免费。 在使用手机的过程中&#xff0c;大家肯定都想拥有一个独特又好看的头像。DIY头像生成就能满足这个需求&#xff0c;它内…

K8S高可用集群-小白学习之二进制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…