第40天 Makefile
一.Makefile介绍Makefile 是一个用于自动化构建和管理项目的文本文件1.作用1.自动化编译通过检测文件修改时间戳仅重新编译发生变化的文件及其依赖文件避免重复编译未改分 提升编译效率2.依赖管理清晰定义文件间的依赖关系明确源文件、头文件和目标文件等之间的关联确保项目构建确3.流程规范统一项目的构建命令和流程使得项目构建过程标准化便于团队协作开发和项目维护2.优势Makefile 能够智能判断文件变化实现增量编译极大地提高了编译效率同时规范了项目管理流程使项目构建更加有序3.Makefile 与 make 工具的关系make 工具作为解释器读取和解析 Makefile 文件中的规则它根据文件的时间戳判断是否需要重 新编译从而实现自动化构建。Makefile 则是定义项目构建规则和流程的脚本两者紧密配合完成项目的自动化构建任务4.适用场景1.多文件项目开发当项目包含多个源文件如.c、.cpp、头文件.h和库文件时手动编译命令繁琐易错Makefile 可通过依赖关系自动管理编译顺序2.增量编译需求仅重新编译修改过的文件及其依赖文件大幅减少编译时间。例如在大型项目中 修改一个头文件仅需重建相关.c 文件3.跨平台构建通过条件判断适配不同操作系统的编译选项、头文件路径和链接库实现跨平台项目 的统一构建4. 复杂项目分层管理支持递归构建子目录如内核模块、第三方库配合伪目标实现统一的构建 make all和清理make clean操作方便管理复杂项目的各个模块二.Makefile基本规则格式目标 (target): 依赖 (prerequisites)命令 (commands)1.目标可以是要生成的文件,也可以是伪目标(操作)伪目标不是真实的文件用于执行特定的操作如清理生成的文件声明伪目标时需通过.PHONY关键字显式标记避免因同名文件存在而导致目标失效2.依赖生成目标所需的文件列表当依赖文件的修改时间比目标文件新时目标需要重新生成3.命令生成目标的具体操作每条命令单独一行且必须以Tab 键缩进 (不能用空格代替),在命令前添加 符号可禁止命令本身的回显仅显示执行结果用于提升输出可读性;4.make 工具通过比较目标与依赖文件的修改时间戳仅当依赖文件比目标 “更新” 时才执行命令重新生成目标实现增量构建。三.Makefile中的变量Makefile 中的变量本质为字符串用于存储编译器、编译选项、文件名等信息;变量的引用$(变量名) (小括号不可丢)1.定义方式1. 延迟赋值当使用此变量时才会对变量进行赋值操作格式变量名 变量的初始值2. :立即赋值定义时直接展开不支持引用未定义变量格式变量名 : 变量的初始值3. 追加赋值在原有值后添加新字符串用空格分隔格式变量名 变量的初始值4. ?条件赋值判断变量是否有初始值如果有值就不赋值如果没有初始值才会进行赋值的操作格式变量名 ? 变量的初始值2.常用变量惯例变量名说明CC指定 C 编译器通常默认值为gcc可重新赋值为其他 C 编译器路径或名称CFLAGS用于指定 C 编译器的编译选项如-Wall开启所有警告、-g生成调试信息等CPPFLAGSC 预处理器的选项例如包含头文件的路径等CXX指定 C 编译器默认可能是g同样可修改为其他 C 编译器CXXFLAGSC 编译器的编译选项与CFLAGS类似针对 C 代码编译OBJS通常用于表示目标文件列表是由源文件编译生成的中间文件LDFLAGS链接器的选项例如指定库文件路径、链接特定的库等LIBS需要链接的库文件列表如-lm链接数学库、-lpthread链接线程库等AR归档器用于创建和维护静态库通常为arARFLAGS归档器的选项用于指定创建静态库的相关参数RM用于指定删除文件的命令通常默认值为rm -f-f选项表示强制删除不提示确认3.变量的类型1.自定义变量由用户自行定义可灵活设置和修改用于存储项目中的各类信息像源文件路径、 目标文件路径、编译选项、链接选项等。2.预定义变量是 Make 工具自身携带的变量具备默认值;3.自动化变量(局部变量)1.$ 代表当前目标对应的字符串即正在生成的目标文件的名称2.$^ 表示所有依赖对应的字符串即依赖的所有文件的列表(会自动去除重复的依赖文件)3.$ :指第一个依赖对应的字符串即当前目标的第一个依赖文件4.三种变量类型对比:变量类型定义来源赋值特点作用域典型应用场景自定义变量用户自行定义可通过延迟赋值、: 立即赋值、追加 赋值、?条件赋值确 定值灵活性高全局在Makefile文件中 都可访问用于存储项目中自定义信息如 源文件路径、自定义编译选项等预定义变量Make 工具自带有默认值用户可按需覆盖 默认值来调整构建过程全局涉及 Make 工具默认行为的设置 如指定编译器、链接器等自动化变量无特定用户定义 在规则命令中起作用在规则的命令中依据上下 文自动获取值仅在当前规 则命令内有效仅在规则的命令中有效在规则命令中处理目标文件和依 赖文件相关操作如编译、链接四.Makefile中的函数1.wildcard函数 获取匹配的文件列表在当前目录及其子目录中按指定模式 “PATTERN” 查找并列出所有符合格式的文件名1.语法$(wildcard PATTERN)其中 “PATTERN” 为文件匹配模式字符串2.返回值以空格分隔的符合模式 “PATTERN” 的文件名列表无匹配文件时返回空字符串$(wildcard *.c)返回当前目录下所有 .c 源文件列表$(wildcard include/*.h)返回 include 目录下所有 .h 头文件列表3.应用场景自动收集源文件自动发现目录下的所有源文件避免手动维护文件列表提高项目可扩展性查找条件构建逻辑根据文件是否存在决定构建行为实现灵活的条件编译等等4.注意事项1.仅匹配实际存在的文件wildcard 只返回文件系统中真实存在的文件路径无匹配文件时返回空值2.通配符路径精确性需明确指定搜索目录避免意外匹配其他路径3. 变量与函数结合时需确保变量值正确4.使用$(info text)打印变量值验证匹配结果2.patsubst函数 模式替换函数1.函数功能对指定字符串TEXT中的单词进行模式匹配替换将符合模式PATTERN的部分替换为 指定的替换模板REPLACEMENT模式中的 “%” 代表任意字符序列替换模板中的 “%” 会被 自动替换为模式中 “%” 所匹配的内容2.语法$(patsubst PATTERN,REPLACEMENT,TEXT)PATTERN包含 “%” 的匹配模式如%.cREPLACEMENT替换模板如%.oTEXT待处理的字符串通常为文件名列表3.返回值替换后的新字符串原字符串中不符合模式的部分保持不变。若无可匹配项则返回原字符串$(patsubst %.c,%.o,main.c func.c)将字符串 main.c func.c 里所有符合 %.c 模式的单词替换 成以 .o 结尾的形式4.应用场景源文件与目标文件自动映射将 .c 文件列表转换为 .o 目标文件列表避免手动维护重复的文件名批量修改文件路径或扩展名如将src/目录下的文件映射到build/目录等等5.注意事项“%” 仅匹配完整单词模式替换基于空格分隔的单词而非字符串片段模式与替换模板需严格对应替换模板中的 % 必须与模式中的 % 对应相同内容字面量 “%” 的转义若需在模式或替换模板中使用字面量 %需用 \% 转义

相关新闻

维特智能定制单轴倾角传感器助力光伏跟踪实现光伏板姿态自动调整

维特智能定制单轴倾角传感器助力光伏跟踪实现光伏板姿态自动调整

一家位于四川的太阳能跟踪控制企业,长期专注光伏跟踪控制领域,产品用于光伏电站的太阳跟踪系统。跟踪控制器需要知道光伏板当前的实际倾角,才能驱动电机把板面转到目标照射角度。基于维特智能 SINVT01 的一款单轴倾角传感器:量程 …

2026/9/30 18:33:01 阅读更多 →
App-Store-Connect-CLI 订阅组版本(Subscription Group Versions)4.4.1 支持实战:命令布局、OpenAPI 契约与源码级实现解析

App-Store-Connect-CLI 订阅组版本(Subscription Group Versions)4.4.1 支持实战:命令布局、OpenAPI 契约与源码级实现解析

【免费下载链接】App-Store-Connect-CLI Fast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more 项目地址: https://gitcode.com/gh_mirrors/ap/App-Store-Co…

2026/10/1 8:54:24 阅读更多 →
Claude Opus 5.5 API接入指南:三条路径与高频排障

Claude Opus 5.5 API接入指南:三条路径与高频排障

先聊一个可能大家都有的感受:模型能力再强,接不进去就是白搭。Claude Opus 5.5 发布之后,社区里讨论最多的其实不是它又变强了多少,而是怎么把它稳当地接进自己的项目。这篇 claude-opus-5.5 API 接入指南,核心就解决三…

2026/9/30 15:55:14 阅读更多 →

最新新闻

从零构建可交付AI系统:契约驱动的工程化实践

从零构建可交付AI系统:契约驱动的工程化实践

1. 这不是“搭积木”,而是亲手锻造AI系统的底层骨架“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:又要学Python、调PyTorch、跑个ResNet?不。这六个单词背后压根不是“复现论文”或“微调模型”的轻量级动作…

2026/10/1 19:40:17 阅读更多 →
Wine兼容层演进简史:从Madeira实验分支谈起

Wine兼容层演进简史:从Madeira实验分支谈起

我理解您的要求,但需要说明:当前输入中仅提供了项目标题“Madeira”及相关热搜词、网络热词列表, 未提供任何实质性的项目正文、摘要描述或可解析的业务上下文 。根据您设定的核心任务原则——“仅通过项目标题,挖掘标题背后的核…

2026/10/1 19:40:17 阅读更多 →
Redis如何赋能AI应用:向量检索、缓存加速与任务协调实战

Redis如何赋能AI应用:向量检索、缓存加速与任务协调实战

1. 先搞清楚一件事:Redis 到底是怎么“接入 AI”的1.1 我理解的“Redis 接入 AI”,指的是三件事最近“Redis 正式接入 AI”这个说法传得挺火,作为一个从 Redis 3.0 时代就开始用的老东西,我第一反应是:这标题确实容易让…

2026/10/1 19:40:17 阅读更多 →
云渲染平台怎么选?Blender/C4D实操与RTX 5090节点实测

云渲染平台怎么选?Blender/C4D实操与RTX 5090节点实测

搞Blender、C4D这一行的,迟早会撞上同一个问题:本地机器跑不动了。不是显卡不行,而是项目不等人。几百帧的动画、4K分辨率、大场景置换、复杂灯光材质,随便叠一两个buff,本地GPU就得烧到满负荷,就连吃饭睡觉…

2026/10/1 19:40:17 阅读更多 →
MATLAB纯编程实现燃料电池混合动力ECMS能量管理策略

MATLAB纯编程实现燃料电池混合动力ECMS能量管理策略

混合动力系统的能量管理策略,这两年做的人不少,但真正把“等效氢气消耗最小化”这件事从原理讲到代码落地的资料并不多。这个方向正好卡在车辆工程和控制算法的交叉点上:既要求你懂燃料电池和动力电池的脾气,又要求你能把优化问题…

2026/10/1 19:40:17 阅读更多 →
大模型参数调优实战:temperature、top_p、max_tokens 核心参数详解

大模型参数调优实战:temperature、top_p、max_tokens 核心参数详解

1. 参数体系到底在调什么:从一次“输出跑偏”说起很多人第一次接触参数调优,都是被逼的。我印象特别深,早些年帮一个做智能客服的朋友排查问题,他们的机器人回答用户问题时,要么答非所问,要么一句话翻来覆去…

2026/10/1 19:39:16 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →