当前位置: 首页 > article >正文

Make:目标(Target)构建的详细和依赖项的处理过程(个人总结)

相关文章Make专栏https://blog.csdn.net/weixin_45791458/category_12383799.html这段时间在用makefile所以自己探究了一下make的工作过程并经过实验总结了一些规律。对于一个规则的处理如下首先make会检查规则中的目标文件是否存在和依赖项的情况即四种可能出现的情况1、如果目标文件不存在同时也没有依赖文件项也就是冒号后面为空那么该规则的命令一定会执行因为对于make来说它找不到任何现成文件可以说明这个目标已经是最新的所以唯一能做的就是直接执行命令去尝试生成目标或者完成这个动作。2、如果目标文件存在同时也没有依赖文件项那么该规则的命令一定不会执行因为既然目标已经存在而规则又没有告诉make“它依赖于谁”那么make就会认为没有任何证据表明它已经过时自然也就没有必要重复执行这条规则下面的命令。3、如果目标文件不存在同时有依赖文件项也就是冒号后面至少列出一个依赖那么make不会直接盲目执行当前规则的命令而是会先去检查并处理这些依赖项。只有当依赖项都检查完成后make才会回到当前目标并且由于目标文件本身不存在所以当前规则的命令最终一定会执行。4、如果目标文件存在同时也有依赖文件项那么make仍然会先检查并处理所有依赖项等依赖项处理结束后再根据目标文件与依赖文件的时间关系决定当前规则的命令是否执行。也就是说这种情况下当前规则下面的命令不一定执行而是要看依赖项是否比目标更新。上面这四条看上去是在描述目标文件是否存在、规则命令是否执行之间的关系但如果再往深一点看就会发现make真正的工作重点其实不在“当前目标”本身而在“依赖项的递归检查和处理”。因为对于make来说一个目标之所以可能需要更新通常不是因为它自己突然“变旧了”而是因为它依赖的某个东西发生了变化。所以理解make关键要理解它是如何处理依赖项的。在真正处理依赖项时make会从左到右依次检查当前规则中列出的每一个依赖项并且这种检查不是简单看一眼文件在不在而是会继续判断该依赖项是否也是某条规则的目标。如果是那么这个依赖项本身也可能需要进一步构建于是make会继续递归处理它。换句话说make的执行方式更像是深度优先地展开一棵依赖树而不是平铺地按文件书写顺序一路往下执行。依赖项的检查是从左至右对各个依赖项进行检查并可能会根据结果处理其他规则只有一个依赖项的检查完毕才会开始下一个依赖项的检查分为下面三种情况1、如果该依赖项对应的文件当前不存在那么make会继续在当前makefile中查找是否存在“以这个依赖项为目标”的规则。如果找到了make就会先递归处理这条规则也就是先想办法把这个缺失的依赖项构建出来如果找不到make就会报错因为它知道当前目标依赖这个文件但又没有办法生成它。2、如果该依赖项对应的文件当前存在那么make仍然会继续检查当前makefile中是否存在“以这个依赖项为目标”的规则。因为即使文件现在存在也不代表它一定是最新的make仍然可能需要通过那条规则去更新它。只有在确认依赖项已经处理完成之后make才会继续看下一个依赖项。如果没有以该依赖项文件为目标的规则则视为该依赖项检查完毕是否执行规则的命令取决于第三点。3、如果所有依赖项文件在检查时都存在即都满足第二点则make会在所有依赖项文件检查完毕后对目标文件和所有依赖项文件进行修改时间的对比如果有一个依赖项比目标文件新则会执行规则的命令否则不会执行规则的命令。下面结合几个具体例子来看。例1main:main.o gcc -o main main.o main.o:main.c gcc -c main.c -o main.o sleep 5 gcc -o main main.o sleep 5对于以上的makefile如果main文件不存在则一定会在最后执行gcc -o main main.o命令如规则处理的第三点所说。如果main.o不存在而main存在也一定会在最后执行gcc -o main main.o构建如规则处理的第四点和依赖项的检查的第一点所说。极端情况下即使你在main.o规则的命令中创建了main.o和main并使main新于main.o因为此时对于main和main.o的比较不会进行在检查到main.o不存在时gcc -o main main.o就注定要执行如规则处理的第四点所说。例2clean: echo clean对于以上的makefile正常情况下clean文件总是不存在的所以每当make clean时都会执行echo clean命令但如果人为使clean文件存在时make clean时会告诉你clean已经是最新因此需要伪目标的引入。例3clean: clean1 echo clean clean1: echo clean1对于以上的makefile即使clean文件存在make clean依然可以顺利执行两条echo命令因为clean1文件不存在所以目标为clean的规则的命令一定会在规则的所有依赖项文件被处理后执行。假如clean1和clean文件都存在则会根据他们两个的修改时间决定是否执行echo clean至于echo clean1命令是不会执行的因为在这种情况下clean1规则的目标文件clean1存在且该规则无依赖项如规则处理的第二点所说。例4main: main.o gcc -o main main1.o main.o: main.c gcc -c main.c -o main1.o以上的文件在每次执行make时都会尝试构建main.o因为main.o这个规则命令设置的问题只会构建main1.o。这就表示了make在执行命令时不会尝试理解命令所以一个正确的命令是好的makefile的前提。顺带一提如果在这里人为插入一个main.o则make时main.o对应规则的命令是否执行取决于main.o和main.c修改时间的对比而main对应规则的命令是否执行取决于main和main.o修改时间的对比。

相关文章:

Make:目标(Target)构建的详细和依赖项的处理过程(个人总结)

相关文章 Make专栏https://blog.csdn.net/weixin_45791458/category_12383799.html 这段时间在用makefile,所以自己探究了一下make的工作过程,并经过实验总结了一些规律。 对于一个规则的处理如下,首先make会检查规则中的目标文件是否存在和…...

Linux:模式通配符 * 和globstar **(bash4新增)的使用

相关文章 Linux专栏https://blog.csdn.net/weixin_45791458/category_12234591.html 在bash的使用过程中,模式通配符可以说是最常见、也最实用的一类功能。很多时候我们在命令行里处理文件,并不是靠把完整文件名一个个手工敲出来,而是通过ba…...

Topit窗口置顶效率引擎:重新定义Mac多任务工作流

Topit窗口置顶效率引擎:重新定义Mac多任务工作流 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 在信息爆炸的时代,我们每天需要处理的窗…...

Lux编译器完整指南:如何将用户意图智能转化为可视化规范

Lux编译器完整指南:如何将用户意图智能转化为可视化规范 【免费下载链接】lux Automatically visualize your pandas dataframe via a single print! 📊 💡 项目地址: https://gitcode.com/gh_mirrors/lux/lux Lux编译器是Lux数据可视…...

深入解析AdminBSB:Bootstrap 3.x与Material Design完美融合的终极指南

深入解析AdminBSB:Bootstrap 3.x与Material Design完美融合的终极指南 【免费下载链接】AdminBSBMaterialDesign AdminBSB - Free admin panel that is based on Bootstrap 3.x with Material Design 项目地址: https://gitcode.com/gh_mirrors/ad/AdminBSBMateri…...

seo网络优化如何提高网站的转化率

SEO网络优化如何提高网站的转化率 在当前的互联网时代,网站的流量和转化率是衡量企业在网络上竞争力的重要指标。而搜索引擎优化(SEO)网络优化作为提高网站流量和转化率的有效手段,其重要性不言而喻。SEO网络优化究竟能如何有效提…...

AWS容器服务终极指南:如何实现高效微服务治理与API网关集成

AWS容器服务终极指南:如何实现高效微服务治理与API网关集成 【免费下载链接】containers-roadmap This is the public roadmap for AWS container services (ECS, ECR, Fargate, and EKS). 项目地址: https://gitcode.com/gh_mirrors/co/containers-roadmap …...

永久保存QQ空间记忆:GetQzonehistory数据备份工具完全指南

永久保存QQ空间记忆:GetQzonehistory数据备份工具完全指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的青春记忆大多存储在社交平台中&…...

基于MATLAB Robotics Toolbox的机械臂轨迹规划仿真与数据可视化分析

基于MATLAB Robotics Toolbox的机械臂轨迹规划仿真与数据可视化分析 摘要 机械臂轨迹规划是机器人学研究的核心问题之一,直接影响工业机器人的作业精度、运动平稳性和工作效率。本文以六自由度PUMA560型机械臂为研究对象,利用Peter Corke开发的Robotics Toolbox for MATLAB…...

基于逻辑回归与XGBoost的冠心病风险预测模型比较研究——以UCI Heart Disease数据集为例

基于逻辑回归与XGBoost的冠心病风险预测模型比较研究——以UCI Heart Disease数据集为例 摘要 冠心病是当前全球范围内致死率最高的心血管疾病之一,早期准确识别高危人群对于降低发病率和死亡率具有重要意义。本研究以UCI Heart Disease数据集为基础,系统比较了逻辑回归与X…...

openclaw行为式AI重构:从昂贵Token到高效对象协作

从昂贵的token消耗到高效的对象协作,重新设计行为式AI的核心架构 问题诊断:为什么当前行为式AI如此“昂贵”? OpenClaw等工具的核心架构依赖生成式大模型作为“大脑”,通过反复的推理-行动循环完成任务。这种设计导致: 高Token消耗的根源 重复的上下文传递:每次循环都需…...

后软件时代:当交互成为本能

从显式操作到隐式协同,从界面到无界 范式转移:从“使用工具”到“与伙伴共存” 当软件不再以独立形态存在,交互的本质将从主动操作变为自然协同。这不仅是技术变革,更是人类与机器关系的根本重构。 交互层级的演进 第一层:意图直连 过去:打开App → 点击按钮 → 输入…...

面向对象AI启示下的软件设计新范式

当物理世界成为对象网络,我们的软件架构该如何进化? 核心理念:软件作为“对象生态”的模拟器 从面向对象AI的启示中,我们得到的核心洞见是:优秀的软件应该像智能体理解物理世界一样,理解自己的问题域。这意味着软件不再仅仅是数据处理管道,而是一个动态的、对象化的生态…...

得意黑Smiley Sans字体全平台部署与深度应用指南

得意黑Smiley Sans字体全平台部署与深度应用指南 【免费下载链接】smiley-sans 得意黑 Smiley Sans:一款在人文观感和几何特征中寻找平衡的中文黑体 项目地址: https://gitcode.com/gh_mirrors/smi/smiley-sans 1 价值定位:现代设计的字体革新选择…...

Linux上使用apt-file查找编译时缺失的依赖库

前言:在Linux上做开发时会遇到依赖库缺失与环境配置问题,如报"fatal error:xxxxxxx.h:没有那个文件或者目录"等错误,此时则只能通过提示中缺失的头文件"xxxxxxx.h"进行缺失依赖库的定位,若错误提示的头文件为…...

【Docker】Docker的安装、使用(安装nginx、mysql、redis)、配置加速镜像、项目部署;查看lastest镜像具体版本并改tag

Docker的安装 官方文档: Docker Docs Docker Hub: Docker Hub Container Image Library | App Containerization centos7安装 1、安装 清华镜像站: docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mi…...

三极管相关电路

注意:1、判断三极管工作在什么区,最严谨的判断是根据发射结和集电极的正偏以及反偏来判断的。后面为了工程方便分析才没有用严谨的判断方案。要求必须背下三极管和二极管的伏安特性曲线。 三极管简单介绍:三极管分为n管和p管,n管为npn,p管为pnp。三极管有三个引脚,是基极…...

新手零失败安装eNSP指南:用快马AI生成你的专属安装助手

新手零失败安装eNSP指南:用快马AI生成你的专属安装助手 最近在学习网络技术,第一步就是要安装华为的eNSP模拟器。作为一个纯新手,光是看到各种依赖组件就头大了:WinPcap、VirtualBox、Wireshark...更别提安装过程中可能遇到的各种…...

Windows环境下Dlib库安装完全指南:从报错到成功的实战手册

Windows环境下Dlib库安装完全指南:从报错到成功的实战手册 【免费下载链接】Dlib_Windows_Python3.x Dlib compiled binaries (.whl) for Python 3.7-3.14 and Windows x64 项目地址: https://gitcode.com/gh_mirrors/dl/Dlib_Windows_Python3.x 问题定位&am…...

算力基建工程:NVIDIA产业链下的求职机会——什么是CUDA编程,为什么它成为了2026年的“金饭碗”?

在2026年的北美科技求职市场中,AI 行业的红利正在经历一次极其冷酷的“底层沉淀”。当应用层的 AI 产品陷入残酷的同质化红海竞争,且大量依赖 API 调用的传统软件工程师岗位面临饱和风险时,大厂的巨额资金和核心 Headcount 正在疯狂向一个更硬…...

终极指南:Tantivy全文搜索引擎如何实现17种拉丁语言的高效词干提取技术

终极指南:Tantivy全文搜索引擎如何实现17种拉丁语言的高效词干提取技术 【免费下载链接】tantivy Tantivy is a full-text search engine library inspired by Apache Lucene and written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ta/tantivy …...

@Value赋值踩的坑

Spring Boot 配置文件中的科学计数法陷阱 ⚠️ 警惕:YAML 配置中的字符串被误解析为数字的问题 📋 问题场景 1. 配置文件示例 # 测试环境配置 ✅ xunfei:appid: 0e1d789dapisecret: NzE5ZmExxxxxxxTFkNmY1ZWJjZTA1apikey: d228r7t8xxxxxxxc0bebb17e377…...

如何用低代码工作流解决业务流程自动化难题:从设计到落地的实践指南

如何用低代码工作流解决业务流程自动化难题:从设计到落地的实践指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/…...

Baichuan-7B代码生成能力:编程助手的最佳选择 - 7B参数大模型的终极指南

Baichuan-7B代码生成能力:编程助手的最佳选择 - 7B参数大模型的终极指南 【免费下载链接】Baichuan-7B A large-scale 7B pretraining language model developed by BaiChuan-Inc. 项目地址: https://gitcode.com/gh_mirrors/ba/Baichuan-7B Baichuan-7B是由…...

SEO优化有哪些快速有效的方法_自媒体如何通过SEO快速提升曝光度

SEO优化有哪些快速有效的方法 在当前数字化时代,自媒体如何通过SEO快速提升曝光度成为了许多内容创作者和网络营销人员关注的焦点。搜索引擎优化(SEO)不仅能够提升网站的自然排名,还能有效增加自媒体的曝光度。具体有哪些快速有效…...

WordPress内容组织终极指南:Argon主题标签与分类管理新策略

WordPress内容组织终极指南:Argon主题标签与分类管理新策略 【免费下载链接】argon-theme 📖 Argon - 一个轻盈、简洁的 WordPress 主题 项目地址: https://gitcode.com/gh_mirrors/ar/argon-theme Argon主题是一款轻盈、简洁的WordPress主题&…...

直播推流技术:突破平台限制的开发者解决方案

直播推流技术:突破平台限制的开发者解决方案 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题功能 项目…...

如何为Windows 11 LTSC系统一键安装微软商店:3分钟解决应用生态难题

如何为Windows 11 LTSC系统一键安装微软商店:3分钟解决应用生态难题 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用Windows …...

终极指南:如何使用PodSecurityContext构建云原生安全防护屏障

终极指南:如何使用PodSecurityContext构建云原生安全防护屏障 【免费下载链接】awesome-design-patterns A curated list of software and architecture related design patterns. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-design-patterns …...

星图平台Qwen3-VL:30B效果对比:与Qwen2-VL、LLaVA-1.6在飞书办公场景中的能力差异

星图平台Qwen3-VL:30B效果对比:与Qwen2-VL、LLaVA-1.6在飞书办公场景中的能力差异 如果你正在寻找一个能在飞书里“看懂”图片、表格、文档,还能跟你智能对话的办公助手,那么这篇文章就是为你准备的。 上篇文章我们详细讲解了如何在星图平台…...