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

Makefile含%通配符报‘No rule to make target’错误的解决求助

解决Makefile复制更新文件的问题

问题根源

  1. 直接把模式规则$(export_folder)/application/assets/%作为子make的目标,make无法识别这种模糊的模式目标,导致报错。
  2. cp命令参数顺序写反了,正确逻辑是源文件在前,目标在后,你写的cp $@ $<会把目标文件覆盖源文件,完全搞反了。

正确实现方式

方法1:模式规则+wildcard自动匹配文件

先通过wildcard获取assets下的所有文件,生成对应的目标路径,再用模式规则处理复制:

# 定义路径变量,可根据实际目录修改
export_folder := export_bin
# 获取assets目录下所有文件(包括子目录)
SRC_ASSETS := $(wildcard assets/**/*)
# 替换路径,生成目标文件列表
DST_ASSETS := $(patsubst assets/%,$(export_folder)/application/assets/%,$(SRC_ASSETS))

build_game: $(DST_ASSETS)
	# 这里放build_game的其他构建命令
	...

# 匹配所有需要复制的文件规则
$(export_folder)/application/assets/%: assets/%
	# 先创建目标目录,避免目录不存在报错
	mkdir -p $(dir $@)
	# 正确复制顺序:源文件($<) -> 目标文件($@)
	cp $< $@

方法2:用rsync简化操作(推荐)

如果系统支持rsync,可以用它高效同步更新的文件,省去复杂规则:

export_folder := export_bin

build_game: sync_assets
	# 其他构建命令
	...

sync_assets:
	rsync -av assets/ $(export_folder)/application/assets/
  • -a:归档模式,保留文件属性
  • -v:输出同步详情(可选)
  • 若需要删除目标目录中源目录不存在的文件,可添加--delete参数

关键提示

  • 模式规则不能直接作为$(MAKE)的目标,必须生成具体的目标文件列表
  • 复制文件时务必确认cp的参数顺序,别搞反源和目标
  • 提前创建目标目录,避免因目录不存在导致复制失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:11