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

C语言单元测试Makefile执行make test无法匹配test_前缀规则怎么办

问题解决方法

问题根因

规则匹配异常来自两个核心配置错误:

  1. test目标直接使用通配符$(SRCTEST)/test_*.exe作为依赖,当对应exe文件不存在时,make不会自动将通配符展开为所有测试用例对应的目标,反而会将通配符字符串作为整体查找生成规则,触发通用的%.exe匹配。
  2. 原测试模式规则test_%.exe仅匹配当前工作目录下的test_开头exe文件,而test目标的依赖是带$(SRCTEST)路径前缀的文件,路径不匹配导致make找不到对应的专用规则,只能回退到通用%.exe规则。

修改后的完整Makefile

CC := gcc
CFLAGS := -Wall -Werror
CSYNTAX := -fsyntax-only -Wall

SRC = $(wildcard ./src/*.c)
DEP = $(SRC:.c=.exe)

SRCTEST = ./test/UnitTests
PATHI = ./test/UnitTests/includes
PATHU = ./test/UnitTests/Unity
INC := ./src/includes

# 新增:提前展开所有测试源文件和对应的测试目标
TESTSRC = $(wildcard $(SRCTEST)/test_*.c)
TESTEXE = $(TESTSRC:.c=.exe)


# Compilation of main program
all: $(DEP)

syntax: *.c $(SRC) $(TESTSRC)
	$(CC) $(CSYNTAX) $^ $(CFLAGS) -I$(INC) -I $(PATHI)

%.exe: *.c $(SRC)
	$(CC) $^ $(CFLAGS) -I$(INC) -o $@ 
	./$@


# Compilation and execution of tests
test: $(TESTEXE)

# 修改:给测试规则加上路径前缀,匹配依赖的路径格式
$(SRCTEST)/test_%.exe: $(SRCTEST)/test_%.c $(SRC) $(PATHU)/unity.c
	$(CC) $(CFLAGS) $^ -I $(INC) -I $(PATHI) -I $(PATHU) -o $@
	./$@

# 修正clean规则,兼容MinGW和Linux,同时删除所有目录下的exe
ifeq ($(OS),Windows_NT)
clean:
	del /Q *.exe src\*.exe $(SRCTEST)\*.exe
else
clean:
	rm -f *.exe src/*.exe $(SRCTEST)/*.exe
endif

关键修改说明

  • 新增TESTSRC、TESTEXE变量,提前通过wildcard匹配所有测试源文件,替换为对应的exe目标,make可以明确知道需要生成哪些测试文件,避免通配符匹配异常
  • 调整测试模式规则的目标前缀为$(SRCTEST)/test_%.exe,和test目标的依赖路径完全匹配,GNU make会优先选择更具体的模式规则,不会触发通用%.exe规则
  • 修正clean规则,兼容MinGW和Linux环境,同时覆盖src目录、测试目录下的exe文件,避免残留旧编译产物
  • 注意:Makefile中所有命令行的缩进必须为Tab字符,不能用空格替换,否则会触发语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:00:01