C语言单元测试Makefile执行make test无法匹配test_前缀规则怎么办
问题解决方法
问题根因
规则匹配异常来自两个核心配置错误:
test目标直接使用通配符$(SRCTEST)/test_*.exe作为依赖,当对应exe文件不存在时,make不会自动将通配符展开为所有测试用例对应的目标,反而会将通配符字符串作为整体查找生成规则,触发通用的%.exe匹配。- 原测试模式规则
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
相关产品推荐
相关产品推荐

