GNU Make维护归档成员问题:仅首个C文件编译且未存入归档
修复GNU Makefile归档维护问题
问题分析
原Makefile存在几个关键错误:
all目标语法错误:括号未闭合,目标写法不符合Makefile规范- 归档成员规则缺少对应
.o文件的依赖,导致Make无法触发编译流程 - 未正确使用定义好的
OBJMBER变量,无法遍历所有需要归档的目标文件 - 缺少显式的依赖文件(
.d)生成规则(虽你提到此步骤正常,仍补充以保证完整性)
修复后的Makefile
CFLAGS = -fno-builtin -O2 -mcpu32 -Wall PWD = $(shell pwd) XXX = rtems4.11 CPP = m68k-$(XXX)-cpp CC = m68k-$(XXX)-gcc AS = m68k-$(XXX)-as LD = m68k-$(XXX)-ld SIZE = m68k-$(XXX)-size # 头文件目录 INC=../../../inc SYS=../../../inc/sys MNX=../../../inc/minix INCLUDE=-I$(INC) -I$(SYS) -I$(MNX) # 库文件目录 LIB=../../../lib LIBNAM=CONVERSION ARCHIVE=$(LIB)/lib$(LIBNAM).a # 源文件与目标文件 CSRC=$(wildcard *.c) OBJS=$(CSRC:.c=.o) DEPS=$(CSRC:.c=.d) # 生成所有归档成员目标 OBJMBER:=$(foreach OBJ,$(OBJS),$(ARCHIVE)($(OBJ))) -include $(DEPS) # 默认目标:依赖所有归档成员 all: $(OBJMBER) # 归档成员规则:依赖对应的.o文件,确保先编译再归档 $(ARCHIVE)(%.o) : %.o @echo "Add archive member $*" ar -cvr $(ARCHIVE) $< # 编译规则:生成.o文件 %.o: %.c @echo "Compile $@ from $<" $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ # 依赖文件生成规则 %.d: %.c @echo "Generate dependencies for $<" $(CC) $(INCLUDE) -MM $< > $@.tmp sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@ rm -f $@.tmp
关键修复说明
- 修正
all目标:改为依赖OBJMBER变量,确保所有归档成员都被处理 - 归档成员规则添加依赖:
$(ARCHIVE)(%.o)绑定对应%.o文件,触发完整的编译-归档流程 - 补充
.d文件生成规则:自动生成C文件的头文件依赖,确保头文件变更时重新编译 - 修复语法错误:移除原
all目标中的括号未闭合问题 - 归档命令优化:使用
$<引用依赖的.o文件,避免变量引用错误
验证补充
可添加clean规则清理生成文件,方便重复测试:
clean: rm -f $(OBJS) $(DEPS) $(ARCHIVE)
执行make clean all后,所有C文件会依次编译并添加到目标归档中。
内容的提问来源于stack exchange,提问作者BenJ
相关产品推荐
相关产品推荐

