如何编写Makefile调用各子目录规则编译依赖库并集成到项目中
Makefile实现方案
核心实现逻辑
通过GNU Make内置的foreach遍历索引+eval动态生成规则的方式,实现两个等长列表的一一匹配绑定,无需手动逐个写规则。
完整可运行代码
# 基础变量定义 LIBDIR = lib LIB_SUBDIRS = a b c LIB_SUBDIRS := $(addprefix $(LIBDIR)/, $(LIB_SUBDIRS)) LIB = libfoo.a libbar.so libbaz.dylib # 默认编译目标:编译所有依赖库 all: $(LIB) # 单条库编译规则模板 define LIB_RULE $(1): $(2) $(MAKE) -C $$< cp $$</$$@ . endef # 遍历索引批量生成所有库的编译规则 $(foreach i, $(shell seq 1 $(words $(LIB))), \ $(eval $(call LIB_RULE, $(word $(i), $(LIB)), $(word $(i), $(LIB_SUBDIRS)))) \ ) # 清理规则示例 .PHONY: clean clean: rm -f $(LIB) $(foreach dir, $(LIB_SUBDIRS), $(MAKE) -C $(dir) clean;)
逻辑说明
- 规则模板
LIB_RULE接收两个参数:第一个是库文件名,第二个是对应子目录路径,模板内的变量用$$转义避免提前展开 foreach循环从1遍历到库的总数量,每次取出对应位置的库名和子目录路径,通过eval把模板展开成独立的编译规则- 二次执行时,Make会自动判断当前目录的库文件最后修改时间是否晚于对应子目录的修改时间,若子目录无修改则直接判定目标为最新,不会重复执行操作;如果子目录内有源码修改,子目录的自带Makefile也会自行判断是否需要重新编译,不会做冗余操作
注意事项
- 需保证
LIB和LIB_SUBDIRS的元素顺序一一对应,不要出现顺序错位 - 本实现依赖GNU Make的内置函数,兼容绝大多数Linux/macOS环境下的默认Make版本
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

