You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile报错:No rule to make target 'remww.s'问题求助

解决Makefile报错"No rule to make target 'remww.s'"的问题

我来帮你排查这个问题——你的Makefile规则逻辑有个关键漏洞,导致Make无法自动关联到生成.s文件的步骤,虽然手动执行Scheme命令没问题,但Make的依赖解析需要明确的规则引导。

问题根源分析

当你执行make remww时,Make的执行流程是这样的:

  1. 尝试构建最终目标remww,它依赖remww.o
  2. 尝试构建remww.o,它依赖remww.s
  3. 此时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会自动按以下流程执行:

  1. 检查remww.scm是否存在 → 存在
  2. 执行Scheme命令生成remww.s
  3. 用nasm把remww.s编译成remww.o
  4. 用gcc链接成可执行文件remww

这样就不会再出现找不到remww.s规则的报错了。

内容的提问来源于stack exchange,提问作者Omri Sharvit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:58:30