我想定义一个通用的makefile,它可以包含在不同的makefile中(如果源t.c被编译成t.o并在libl.a中存档):
生成文件:
LIBS := libl
OBJS_libl := t
include c.mk
c.mk:
ALIBS := $(LIBS:%=%.a)
.SECONDEXPANSION:
all : $(ALIBS)
%.a : $$(patsubst %,%.o,$$(OBJS_$$(patsubst %.a,%,$$(@F))))
ar crs $@ $(patsubst %,%.o,$(OBJS_$(@F:%.a=%)))
%.o : %.c
gcc -c $(@F:%.o=%.c) -o $@
目标是规则%.a的先决条件扩展为t.o for libl.a
这似乎适用于显式规则(如果我用libl.a替换%.a)但不适用于隐式规则。
=> make: *** No rule to make target `libl.a', needed by `all'. Stop.
我可以实现这个目标吗?
[编辑]目标确实是在同一个目录中有几个像libl.a这样的库,每个库都有一些对象:
LIBS := libl1 libl2
OBJS_libl1 := t1 u1
OBJS_libl2 := t2 u2
答案 0 :(得分:0)
生成文件:
LIBS := libl.a
$(LIBS): t.o
include c.mk
c.mk:
%.a:
ar crs $@ $^
%.o : %.c
gcc -c $< -o $@
修改
LIBS := libl1.a libl2.a
$(LIBS):
libl1.a : t1.o u1.o
libl2.a : t2.o u2.o
还有别的吗?