Makefile首个目标名称解析为空字符串问题求助
自动生成测试目标的Makefile问题修复
你当前的Makefile用了普通多目标规则,Make解析这类规则时不会逐个目标展开$@,而是一次性处理整个规则,导致第一个目标的依赖项展开为空,引发编译错误。
以下是修正后的完整Makefile,同时实现了无需手动维护目标列表的需求:
CFLAGS = -g -Wall # 自动从所有_test.c文件推导目标,不用手动写TARGETS TARGETS = $(patsubst %_test.c,%,$(wildcard *_test.c)) # 静态模式规则:每个目标对应同名.o和_test.o文件 $(TARGETS): % : %_test.o %.o $(CC) $(CFLAGS) -o $@_test $^ %.o : %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(addsuffix _test, $(TARGETS))
关键修改说明:
- 改用静态模式规则:
$(TARGETS): % : %_test.o %.o会为每个目标单独匹配依赖,确保%正确替换为目标名,解决第一个目标依赖展开为空的问题。 - 自动生成目标列表:通过
wildcard扫描所有_test.c文件,再用patsubst去掉_test.c后缀得到基础目标名,彻底不用手动输入目标。 - 链接命令用
$^:自动展开为当前目标的所有依赖文件,比重复写%_test.o %.o更简洁可靠。 - 修正clean命令的笔误:把
rn改成正确的rm,避免执行错误。
内容的提问来源于stack exchange,提问作者user21749640
相关产品推荐
相关产品推荐

