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

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)

如果你的写法类似但仍报错,可能是这几个原因:

  1. 程序运行返回非0:比如测试程序触发了断言失败、逻辑错误,导致退出状态码不是0。你可以单独运行./prog1和./prog2看看有没有报错;如果确实需要忽略错误,可以在命令前加-前缀(不推荐,除非你明确要跳过错误检查):
test: $(PROG1) $(PROG2)
	-./$(PROG1)
	-./$(PROG2)
  1. 编译命令出错:比如源文件不存在、编译器参数写错,导致编译失败,Make自然会抛出error 1。你可以单独执行编译命令验证是否正常。
  2. 未设置PHONY目标:如果你的test目标和某个文件名重名,Make会把它当成文件目标,当文件存在且比依赖更新时,就不会执行命令,可能让你误以为有错误。所以一定要给test加上.PHONY: test声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:31