Makefile中如何对文件名含$符号的文件使用静态模式规则?
问题核心
Makefile 中 $ 是变量展开的特殊字符,你遇到的文件名无法识别问题,本质是文件名里的 $ 被 Makefile 误判为变量前缀做了展开,再加之前的代码里存在笔误用了未定义的 U_SRC 变量,双重原因导致规则失效。
解决方案
不需要修改生成的源文件名,只需对源文件列表中的 $ 做全局转义即可,完整可运行的 Makefile 如下:
# 匹配所有.c文件,将文件名中的$全局转义为$$,避免被误展开为变量 SRCS := $(subst $,$$,$(wildcard ./*.c)) # 从转义后的源文件列表生成对应的.o目标列表 OBJS := $(patsubst %.c,%.o,$(SRCS)) # 自定义编译参数,可按需修改 CFLAGS := -Wall -O2 # 静态模式规则编译单个.o文件,自动变量会自动处理转义后的文件名 $(OBJS): %.o: %.c gcc $(CFLAGS) -c $< -o $@ # 最终链接生成可执行文件,输出名可按需修改 main: $(OBJS) gcc $(OBJS) -o $@ # 清理规则 .PHONY: clean clean: rm -f $(OBJS) main
说明
- 你之前单独把规则里的
$替换为$$不生效的原因是:没有处理wildcard返回的源文件列表里的$,这些未转义的$在变量展开阶段就已经被处理成无效字符,后续规则自然匹配不到对应文件 - 调整完成后直接执行
make -j 8即可正常并行编译,所有依赖逻辑和原生无特殊字符的编译流程完全一致 - 如果需要单独给某个带
$的源文件加编译参数,写法为$$main.o: CFLAGS += -g(把文件名里的$替换为$$即可)
内容的提问来源于stack exchange,提问作者Shore
相关产品推荐
相关产品推荐

