Makefile执行多程序疑问:调用make test出error 1,写法是否合规?
嘿,我来帮你搞定这两个Makefile的问题!
问题1:如何在Makefile中执行多个程序?
在Makefile里执行多个程序有几种常用的方式,你可以根据需求灵活选择:
- 通过目标依赖串联执行:把每个程序的运行做成独立子目标,再让主目标依赖这些子目标。这种方式的好处是Make会自动判断子目标是否需要重新执行,能节省不必要的操作:
.PHONY: run-prog1 run-prog2 run-all run-prog1: ./program1 run-prog2: ./program2 run-all: run-prog1 run-prog2
执行make run-all就会依次运行program1和program2。
- 在同一个目标内执行多条命令:如果不需要单独控制每个程序的运行,可以把多个命令写在同一个目标下,用分号分隔(不管前序命令是否失败都会执行),或者用
&&连接(前序命令成功才会执行后续命令):
.PHONY: run-all run-all: ./program1 && ./program2 # 或者用分号的写法: # ./program1; ./program2
- 跨目录/子Makefile调用:如果多个程序对应不同目录或子Makefile,可以用
$(MAKE)触发子任务:
.PHONY: run-all run-all: $(MAKE) -C dir1 run $(MAKE) -C dir2 run
问题2:调用
make test出现error 1,当前实现是否正确? 首先得明确Makefile的核心规则:只要命令返回非0状态码,Make就会判定目标执行失败,抛出error 1。你遇到的问题大概率是编译/运行命令本身出错,或者程序运行时返回了非0状态。
先给你一个「编译并运行两个程序」的标准test目标示例,你可以对比自己的实现排查问题:
# 假设你的源文件是prog1.c和prog2.c PROG1 = prog1 PROG2 = prog2 .PHONY: test clean # 编译规则:自动生成可执行文件 $(PROG1): prog1.c gcc -o $@ $^ $(PROG2): prog2.c gcc -o $@ $^ # test目标:先确保编译完成,再运行程序 test: $(PROG1) $(PROG2) ./$(PROG1) ./$(PROG2) clean: rm -f $(PROG1) $(PROG2)
如果你的写法类似但仍报错,可能是这几个原因:
- 程序运行返回非0:比如测试程序触发了断言失败、逻辑错误,导致退出状态码不是0。你可以单独运行
./prog1和./prog2看看有没有报错;如果确实需要忽略错误,可以在命令前加-前缀(不推荐,除非你明确要跳过错误检查):
test: $(PROG1) $(PROG2) -./$(PROG1) -./$(PROG2)
- 编译命令出错:比如源文件不存在、编译器参数写错,导致编译失败,Make自然会抛出error 1。你可以单独执行编译命令验证是否正常。
- 未设置PHONY目标:如果你的
test目标和某个文件名重名,Make会把它当成文件目标,当文件存在且比依赖更新时,就不会执行命令,可能让你误以为有错误。所以一定要给test加上.PHONY: test声明。
内容的提问来源于stack exchange,提问作者strawdeezies
相关产品推荐
相关产品推荐

