新闻详情

新闻详情

首页 / 资讯中心 / 详情

第40天 Makefile

发布时间:2026/9/29 9:46:06来源:尧图网络
第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.注意事项“%” 仅匹配完整单词模式替换基于空格分隔的单词而非字符串片段模式与替换模板需严格对应替换模板中的 % 必须与模式中的 % 对应相同内容字面量 “%” 的转义若需在模式或替换模板中使用字面量 %需用 \% 转义
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI浏览器会取代App吗——从RPA到Computer Use与WebMCP的Agent工作流深度解析 2026/9/29 10:39:54

AI浏览器会取代App吗——从RPA到Computer Use与WebMCP的Agent工作流深度解析

技术观察与工程实践 更新至 2026 年 9 月 AI浏览器会取代App吗——从RPA到Computer Use与WebMCP的Agent工作流深度解析 人工智能|AI浏览器|AI Agent|智能体|RPA|Computer Use|WebMCP|浏览器自动…

阅读更多 →
2026网络安全实习岗位大汇总(含奇安信_安恒_绿盟等头部厂商AI安全方向,本科到博士都适用!建议收藏) 2026/9/29 10:39:48

2026网络安全实习岗位大汇总(含奇安信_安恒_绿盟等头部厂商AI安全方向,本科到博士都适用!建议收藏)

2026网络安全实习岗位大汇总(含奇安信/安恒/绿盟等头部厂商&AI安全方向,本科到博士都适用!建议收藏) 本文汇总了2026年头部安全厂商(奇安信、安恒信息、绿盟科技、长亭科技、启明星辰等)及科研机构&am…

阅读更多 →
期货期权L2五档行情、逐笔成交、分钟日线数据字段速览 2026/9/29 10:39:48

期货期权L2五档行情、逐笔成交、分钟日线数据字段速览

期货期权L2五档行情、逐笔成交、分钟日线数据字段速览 以前搞期货回测的时候,想找一口靠谱的Level2五档数据特别折腾。要么接口一天只给拉几万条,要么把五档合并成一条存成txt,解析起来想砸电脑。后来在CMES金融数据库那边点了点,…

阅读更多 →
OpenHarmony I2C设备开发实战:协议解析与排障技巧 2026/9/29 10:39:47

OpenHarmony I2C设备开发实战:协议解析与排障技巧

做 OpenHarmony 设备开发,十有八九都会撞上 I2C。调触摸屏、读传感器、操作 EEPROM、点亮 OLED,背后都是这条总线在忙活。你要是被一个问题卡了一整天,多半不是器件坏了,而是对 I2C 的理解还差一层窗户纸。这篇内容以实战为出发点…

阅读更多 →
基于Python的Vivado工程RTL代码提取工具:原理与实现 2026/9/29 10:39:47

基于Python的Vivado工程RTL代码提取工具:原理与实现

1. 这个工具到底解决什么问题做FPGA开发的朋友大概率都遇到过这种场景:接手一个前人留下的Vivado工程,打开之后发现里面塞了几十个IP核、上百个源文件,想找某个模块的RTL代码,得在Hierarchy窗口里一层层点开,点到手酸。…

阅读更多 →
mscomm32.ocx丢失怎么办?官方修复流程与单文件下载风险详解 2026/9/29 10:39:47

mscomm32.ocx丢失怎么办?官方修复流程与单文件下载风险详解

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉