文章目录一、通配符介绍1. 什么是通配符2. 为什么需要通配符二、通配符的用法1. 通配符 * 匹配任意长度的任意字符2. 通配符 ?匹配任意单个字符3. 通配符 []匹配方括号内的任意单个字符三、重要注意事项避坑指南四、完整示例五、写在最后在编写 Makefile 时我们经常需要处理多个文件比如编译所有.c文件或者清理所有.o文件。如果逐个列举文件名不仅繁琐而且难以维护。通配符正是为了解决这类问题而设计的。本文将彻底讲清楚这个概念从用法到避坑指南配合实例让你一次性吃透。一、通配符介绍1. 什么是通配符通配符是一种用于匹配文件名的特殊字符是 Makefile 提供的文件名模式匹配语法用于批量匹配文件路径、文件名、后缀名避免手动罗列大量文件。Makefile 核心的四个通配符*、?、[]、%。这是你必须记住的全部没有更多了。本文总结前三个通配符%在下一篇文章总结模式规则内容会详细讲解。2. 为什么需要通配符简化书写批量代替大量文件名代码极简洁。自动适配文件增删无需修改 Makefile 规则。通用规则一套规则适配所有同类文件.c→.o。降低错误避免手动写文件名的拼写错误。二、通配符的用法1. 通配符*匹配任意长度的任意字符核心作用匹配当前目录下非隐藏文件不以.开头的任意名称支持指定后缀 / 前缀的匹配。注意不匹配隐藏文件如.gitignore、.test.c若需匹配隐藏文件需显式指定.如.*.c。例如*.c匹配当前目录下所有后缀为.c的 C 语言源文件如main.c、utils.c。test*匹配当前目录下所有以test开头的文件 / 目录如test.c、test1.o、test_dir。*_lib.*匹配当前目录下所有以_lib结尾、且带有后缀的文件如math_lib.c、log_lib.o。2. 通配符?匹配任意单个字符核心作用匹配文件名中某一个位置的任意单个字符长度严格为 1。例如test?.c匹配test1.c、testa.c、test_.c但不匹配test.c无额外字符也不匹配test12.c两个字符。a?b.c匹配a1b.c、aXb.c但不匹配ab.c、a12b.c。3. 通配符[]匹配方括号内的任意单个字符核心作用匹配方括号内列举的任意单个字符。扩展GNU Make 支持[!...]或[^...]反向匹配表示匹配除了方括号里列出的字符之外的任意单个字符或者更直白一点只要不是方括号中写的那些字符都能匹配上。例如test[123].c枚举匹配仅匹配test1.c、test2.c、test3.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。三、重要注意事项避坑指南变量定义中使用*必须配合wildcard函数。直接在变量中写*Make 不会自动展开为文件列表而是将其视为普通字符串需使用$(wildcard 通配符)函数来触发文件匹配。例如# 错误用法SRC的值是字符串*.c不是实际的.c文件列表SRC_ERROR*.c# 正确用法通过wildcard函数展开SRC获取当前目录下所有.c文件SRC$(wildcard *.c)通配符不匹配子目录*.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搜索嵌入式技术部落。