Makefile含%通配符报‘No rule to make target’错误的解决求助
解决Makefile复制更新文件的问题
问题根源
- 直接把模式规则
$(export_folder)/application/assets/%作为子make的目标,make无法识别这种模糊的模式目标,导致报错。 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
相关产品推荐
相关产品推荐

