GNU Make使用模式规则时报错No rule to make target '%.c'如何解决?
错误原因
你当前的写法不符合GNU Make模式规则的语法要求:
- 模式规则的核心是目标和依赖都需要包含通配符
%,用于保证目标和依赖的匹配字段一致,典型合法写法如%.o: %.c,表示所有.o文件的编译依赖对应同名的.c文件。 - 你单独在依赖位置写
%.c时,Make不会把它识别为匹配所有.c文件的通配符,只会将其当做字面意义上的文件%.c去查找,找不到就会抛出你遇到的报错。
正确解决方案
如果你要实现「将当前目录所有.c文件编译为同一个test可执行」的需求,不需要用模式规则,使用Make内置的wildcard函数获取所有.c文件即可,正确的Makefile写法如下:
# 匹配当前目录所有.c文件,存入SRCS变量 SRCS := $(wildcard *.c) all: test test: $(SRCS) gcc -o $@ $^
注意这里用自动变量
$^代替$?,$^会展开为所有依赖文件,符合全量编译所有源文件的需求;$?仅会展开为比目标更新的依赖文件,适合增量编译场景。
模式规则的正确使用场景
如果你需要的是「每个.c文件单独编译为对应同名的可执行文件」,才需要使用模式规则,写法如下:
# 匹配任意名称的可执行目标,依赖对应同名的.c文件 %: %.c gcc -o $@ $<
该规则生效后,执行make test会自动编译test.c生成test可执行,执行make test2会自动编译test2.c生成test2可执行。
内容的提问来源于stack exchange,提问作者Yong
相关产品推荐
相关产品推荐

