如何用一条Makefile规则构建多个依赖不同的静态库?
解决方法:利用Makefile的二次展开特性
你的思路方向是对的,但问题出在Make解析规则的时机上:依赖部分的$(OBJ_$*)会在规则匹配具体目标之前就展开,此时$*还没有对应的值,自然无法关联到正确的目标变量。要让$*在规则匹配后再解析依赖,需要开启二次展开功能。
具体实现步骤
- 在Makefile顶部添加二次展开开关:
.SECONDEXPANSION: - 修改规则,对依赖中的变量引用进行转义,确保二次展开时能正确替换:
%.a: $$(OBJ_%) ar rcs $@ $^
完整示例代码
.SECONDEXPANSION: OBJ_libvmx = vmx.c.o vmx.S.o OBJ_libx86 = mmu.c.o segments.S.o %.a: $$(OBJ_%) ar rcs $@ $^
原理说明
.SECONDEXPANSION:标记告诉Make对规则的依赖部分执行两次展开:- 第一次展开时,
$$(OBJ_%)会被转义为$(OBJ_%); - 当规则匹配到具体目标(比如
libvmx.a)时,%会被替换为libvmx,第二次展开时$(OBJ_libvmx)就会正确替换为对应的目标文件列表。
- 第一次展开时,
调试验证(可选)
如果想确认展开是否正确,可以添加调试输出:
.SECONDEXPANSION: OBJ_libvmx = vmx.c.o vmx.S.o OBJ_libx86 = mmu.c.o segments.S.o %.a: $$(OBJ_%) echo "构建目标:$@,依赖文件:$^" ar rcs $@ $^
运行make libvmx.a会输出:
构建目标:libvmx.a,依赖文件:vmx.c.o vmx.S.o ar rcs libvmx.a vmx.c.o vmx.S.o
内容的提问来源于stack exchange,提问作者Muricula
相关产品推荐
相关产品推荐

