You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用一条Makefile规则构建多个依赖不同的静态库?

解决方法:利用Makefile的二次展开特性

你的思路方向是对的,但问题出在Make解析规则的时机上:依赖部分的$(OBJ_$*)会在规则匹配具体目标之前就展开,此时$*还没有对应的值,自然无法关联到正确的目标变量。要让$*在规则匹配后再解析依赖,需要开启二次展开功能。

具体实现步骤

  1. 在Makefile顶部添加二次展开开关:
    .SECONDEXPANSION:
    
  2. 修改规则,对依赖中的变量引用进行转义,确保二次展开时能正确替换:
    %.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对规则的依赖部分执行两次展开:
    1. 第一次展开时,$$(OBJ_%)会被转义为$(OBJ_%);
    2. 当规则匹配到具体目标(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:42:45