Makefile报错:No rule to make target 'remww.s'问题求助
解决Makefile报错"No rule to make target 'remww.s'"的问题
我来帮你排查这个问题——你的Makefile规则逻辑有个关键漏洞,导致Make无法自动关联到生成.s文件的步骤,虽然手动执行Scheme命令没问题,但Make的依赖解析需要明确的规则引导。
问题根源分析
当你执行make remww时,Make的执行流程是这样的:
- 尝试构建最终目标
remww,它依赖remww.o - 尝试构建
remww.o,它依赖remww.s - 此时Make找不到生成
remww.s的明确规则——你写的%:是一个通用目标规则,仅当目标没有其他匹配规则时才会触发,但remww.s是中间依赖文件,不是你直接指定的目标,所以Make不会触发这个规则来生成它。
修复后的Makefile
把原来的通用目标规则替换成明确的.s文件模式规则,让Make清晰知道.s文件是从对应的.scm生成的:
# 默认目标:构建remww(如果有多个程序,可以定义变量比如PROGRAMS=remww other,然后all: $(PROGRAMS)) all: remww # 明确规则:.s文件依赖同名.scm文件,生成对应.s %.s: %.scm echo '(load "project.scm") (compile-scheme-file "$<.scm" "$<.s")' | scheme -q # 编译.s为.o文件 %.o: %.s nasm -f elf $< -o $@ # 链接.o为可执行文件 %: %.o gcc -m32 -Wall -g $< -o $@ .PHONY: clean clean: rm -f *.o remww # 若有多个程序,可替换为$(PROGRAMS)更通用
关键改动说明
- 新增
%.s: %.scm模式规则:这告诉Make,任何.s文件都依赖同名的.scm文件,执行后面的Scheme命令生成。用自动变量$<(代表第一个依赖文件,也就是.scm文件)代替硬写$(MAKECMDGOALS),规则会更可靠,还能适配任意同名的.scm文件。 - 简化其他规则的写法,用
$<和$@(代表当前目标文件)自动变量代替硬写文件名,让规则更通用灵活。
验证修复
现在执行make remww,Make会自动按以下流程执行:
- 检查
remww.scm是否存在 → 存在 - 执行Scheme命令生成
remww.s - 用nasm把
remww.s编译成remww.o - 用gcc链接成可执行文件
remww
这样就不会再出现找不到remww.s规则的报错了。
内容的提问来源于stack exchange,提问作者Omri Sharvit
相关产品推荐
相关产品推荐

