如何为build目录下生成的任意库归档文件编写一条Makefile模式规则?
解决Makefile中build目录下通用归档文件模式规则的问题
要让模式规则适配build/目录下的任意归档文件,只需要调整规则的目标模式,让它匹配该目录下的归档成员格式即可,不需要为每个库单独编写规则。
可行的通用解决方案
all: build/librot.a( build/rot13.o build/rot47.o ) # 可以轻松添加其他build目录下的库目标,比如:build/libfoo.a( build/foo.o ) ARFLAGS := -rcsU # 通用模式规则:匹配build目录下任意归档文件的任意成员 build/%.a(%): % $(AR) $(ARFLAGS) $@ $%
规则说明
build/%.a(%)是目标模式:- 第一个
%会匹配归档文件的名称(比如librot) - 第二个
%会匹配归档成员的完整路径(比如build/rot13.o)
- 第一个
- 依赖
%正好对应成员文件的实际路径,和目标中的成员部分完全一致 - 这条规则是通用的——不管你要构建
build/目录下的哪一个归档文件,它都能自动匹配对应的成员,无需重复定义规则
原规则失效的原因
你原来的(%): %规则只匹配当前工作目录下的归档文件(格式为librot.a(member)),而当归档文件移到build/目录后,目标格式变成了build/librot.a(member),原模式的开头缺少build/前缀,自然无法匹配。
扩展(如果成员不在build目录)
如果你的目标文件不在build/目录(比如在src/),只需调整依赖部分即可,示例:
build/%.a(src/%.o): src/%.o $(AR) $(ARFLAGS) $@ $<
内容的提问来源于stack exchange,提问作者dc46and2
相关产品推荐
相关产品推荐

