执行Makefile命令时出现‘Nothing to be done for 'all'’错误求助
解决Makefile提示‘Nothing to be done for 'all'’的问题
这个问题我之前也碰到过,本质是Make对目标的默认处理逻辑导致的——它会把规则里的目标当成实际文件来检查。咱们先看看你的Makefile内容:
FILES = file1.c file2.c file3.c all:test test: for file in $(FILES); do echo $$file; done
问题原因
当你运行make时,Make会先检查all的依赖test:
- 如果当前目录下已经存在名为
test的文件,Make会判断这个文件没有更新的必要(因为test目标没有依赖任何其他文件,或者依赖文件没变化),所以会跳过执行test目标下的命令。 - 就算一开始没有
test文件,第一次运行Make执行完命令后,若后续没有修改Makefile或相关依赖,Make还是会认为test目标无需更新,下次运行就会弹出那个错误提示。
解决方案
有两种简单的修复方式:
方式1:声明伪目标(PHONY)
告诉Make,test和all不是实际的文件,只是需要执行命令的“伪目标”,这样Make就不会去检查对应的文件是否存在,每次运行都会执行命令。修改后的Makefile如下:
FILES = file1.c file2.c file3.c # 声明伪目标,让Make跳过文件存在性检查 .PHONY: all test all: test test: for file in $(FILES); do echo $$file; done
方式2:直接绑定命令到all目标
如果不需要test这个中间目标,可以直接把命令写在all下面,同时把all声明为伪目标,简化结构:
FILES = file1.c file2.c file3.c .PHONY: all all: for file in $(FILES); do echo $$file; done
验证
修改后再运行make,就会正常执行循环打印文件列表的命令了。
内容的提问来源于stack exchange,提问作者user1050619
相关产品推荐
相关产品推荐

