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

Makefile核心教程(六) --- 一文吃透 Makefile 通配符

文章目录

    • 一、通配符介绍
      • 1. 什么是通配符?
      • 2. 为什么需要通配符
    • 二、通配符的用法
      • 1. 通配符 `*` :匹配任意长度的任意字符
      • 2. 通配符 `?`:匹配任意单个字符
      • 3. 通配符 `[]`:匹配方括号内的任意单个字符
    • 三、重要注意事项(避坑指南)
    • 四、完整示例
    • 五、写在最后

在编写 Makefile 时,我们经常需要处理多个文件:比如编译所有.c文件,或者清理所有.o文件。如果逐个列举文件名,不仅繁琐而且难以维护。通配符正是为了解决这类问题而设计的。本文将彻底讲清楚这个概念,从用法到避坑指南,配合实例,让你一次性吃透。

一、通配符介绍

1. 什么是通配符?

通配符是一种用于匹配文件名的特殊字符,是 Makefile 提供的文件名模式匹配语法,用于批量匹配文件路径、文件名、后缀名,避免手动罗列大量文件。

Makefile 核心的四个通配符*?[]%。这是你必须记住的全部,没有更多了。本文总结前三个通配符,%在下一篇文章总结模式规则内容会详细讲解。

2. 为什么需要通配符

简化书写:批量代替大量文件名,代码极简洁。

自动适配:文件增删无需修改 Makefile 规则。

通用规则:一套规则适配所有同类文件(.c→.o)。

降低错误:避免手动写文件名的拼写错误。

二、通配符的用法

1. 通配符*:匹配任意长度的任意字符

核心作用:匹配当前目录下非隐藏文件(不以.开头)的任意名称,支持指定后缀 / 前缀的匹配。

注意:不匹配隐藏文件(如.gitignore.test.c),若需匹配隐藏文件需显式指定.(如.*.c)。

例如:

  • *.c:匹配当前目录下所有后缀为.c的 C 语言源文件(如main.cutils.c)。
  • test*:匹配当前目录下所有以test开头的文件 / 目录(如test.ctest1.otest_dir)。
  • *_lib.*:匹配当前目录下所有以_lib结尾、且带有后缀的文件(如math_lib.clog_lib.o)。

2. 通配符?:匹配任意单个字符

核心作用:匹配文件名中某一个位置的任意单个字符,长度严格为 1。

例如:

  • test?.c:匹配test1.ctesta.ctest_.c,但不匹配test.c(无额外字符),也不匹配test12.c(两个字符)。
  • a?b.c:匹配a1b.caXb.c,但不匹配ab.ca12b.c

3. 通配符[]:匹配方括号内的任意单个字符

核心作用:匹配方括号内列举的任意单个字符。

扩展:GNU Make 支持[!...][^...](反向匹配),表示匹配除了方括号里列出的字符之外的任意单个字符,或者更直白一点:只要不是方括号中写的那些字符,都能匹配上。

例如:

  • test[123].c:枚举匹配,仅匹配test1.ctest2.ctest3.c
  • test[a-z].c:范围匹配,匹配testa.c~testz.c的所有小写字母结尾的文件。
  • test[0-9A-Z].c:范围组合,匹配数字(0-9)或大写字母(A-Z)结尾的文件。
  • test[!0-9].c:反向匹配,不匹配数字结尾的test0.c~test9.c文件(如匹配testa.c,不匹配test5.c)。

三、重要注意事项(避坑指南)

  1. 变量定义中使用*,必须配合wildcard函数

直接在变量中写*,Make 不会自动展开为文件列表,而是将其视为普通字符串;需使用$(wildcard 通配符)函数来触发文件匹配。

例如:

# 错误用法:SRC的值是字符串"*.c",不是实际的.c文件列表SRC_ERROR=*.c# 正确用法:通过wildcard函数展开,SRC获取当前目录下所有.c文件SRC=$(wildcard *.c)
  1. 通配符不匹配子目录

*.c只匹配当前目录,不匹配子文件夹。要匹配子目录,可以用:*/*.c(匹配下一层子目录)或者指定目录dir/*.c

# 只匹配当前目录的.c文件SRC=$(wildcard *.c)$(wildcard src/*.c)# 匹配子目录下的.c文件(如src/目录)SRC_SUB=$(wildcard src/*.c)SRC_SUB=$(wildcard */*.c)

四、完整示例

完整源码请前往知识星球【源码】专栏下载,下载后详看目录中的readme.txt文件内容,有疑问欢迎星球内免费提问。

五、写在最后

欢迎加入嵌入式技术部落知识星球,该星球是高质量、干净、专业的嵌入式技术交流互助圈,编程教学,实战项目与源码解析,职场答疑,嵌入式咨询与学习指南,简历辅导等全方位支持。

加入方式,知识星球app搜索"嵌入式技术部落"。

http://www.jsqmd.com/news/606219/

相关文章:

  • 长文本阅读困难?用BERT文本分割工具一键变清晰
  • SpringBoot单元测试实战:从Service到Controller的Mock技巧全解析
  • 嵌入式电机控制基础库:DC/步进/BLDC寄存器级驱动解析
  • DASD-4B-Thinking与LSTM结合:打造高效长序列推理引擎
  • 用STM32F103C8T6+ESP8266做个公交车报站器,附完整电路图和代码(避坑OLED与GPS)
  • 面试小白的经历
  • OpenClaw语音交互:千问3.5-27B+Whisper实现语音指令自动化
  • Anaconda环境管理:为NEURAL MASK创建独立的Python开发与测试环境
  • 浦语灵笔2.5-7B惊艳案例:菜市场摊位照片→食材识别+营养搭配建议输出
  • vue+SpringBoot(前后端交互)
  • Qwen3-14B镜像快速入门:内置模型+完整环境,开箱即用教程
  • 如何制定一个有效的 SEM 推广策略_SEO推广和SEM推广在不同行业中的应用场景有哪些
  • Qwen3-ASR-1.7B多场景落地:盲人辅助阅读器语音输入核心引擎
  • OpenClaw云端沙盒:Qwen2.5-VL-7B镜像10分钟快速体验
  • 实时手机检测-通用效果展示:手机在镜面反射/玻璃橱窗中的识别能力
  • Nanbeige 4.1-3B极简WebUI:5分钟本地部署,打造二次元聊天室
  • 性价比高的小程序开发、软件定制开发;系统开发、网站开发公司推荐——衡水云翼信息技术有限公司 - 品牌企业推荐师(官方)
  • seo推广员如何进行用户体验优化_seo推广员的工作内容有哪些
  • Python面向对象编程(六)--多态
  • Qwen3-TTS开源镜像部署:RabbitMQ消息队列解耦高并发语音合成任务
  • 行业内专业的牛津布袋企业找哪家 - 品牌企业推荐师(官方)
  • 5100+人充电?B站赚钱玩法!
  • [具身智能-258]:人工智能半监督学习详解:在标注的荒原上挖掘数据的金矿
  • 从光电二极管到振动曲线:激光测振信号处理全链路拆解(Python示例)
  • OpenClaw异常处理设计:Qwen3.5-9B图片任务失败自动恢复方案
  • Qwen3-VL-WEBUI部署避坑指南:从镜像拉取到Web界面访问完整流程
  • Qwen3-ASR-1.7B一文详解:GPU算力适配策略与batch size调优经验
  • Davinci NvM Block与Fee Block关联配置详解
  • 防盗网、养殖网、圈地养殖网、圈地围栏、果园围栏、美格网厂家哪家好——安平县德申丝网制品厂(德明美格网) - 品牌企业推荐师(官方)
  • Qwen3.5-4B-Claude-Opus部署案例:GPU温度监控与长时间运行稳定性测试