首页 > 解决方案 > 用 makefile 编译库的成语

问题描述

LIB = lib.a

LIBMEMB = $(LIB)(a.o) $(LIB)(b.o) $(LIB)(c.o)

$(LIB) : $(LIBMEMB)

.c.a:
    $(CC) -c $(CFLAGS) $<
    $(AR) $(ARFLAGS) $@ $*.o
    rm -f $*.o

由于.c.a部分与推理规则相同,我认为上面的 makefile 是一种用于制作库的广泛使用的习惯用法。
但是,我在想这种情况:

所以你像这样改变你的makefile:

LIB = lib.a

LIBMEMB = $(LIB)(b.o) $(LIB)(d.o) $(LIB)(f.o)

$(LIB) : $(LIBMEMB)

.c.a:
    $(CC) -c $(CFLAGS) $<
    $(AR) $(ARFLAGS) $@ $*.o
    rm -f $*.o

然后a.oandc.o仍然会在 中lib.a,但它不应该。由于这是一种常见情况,我认为必须有一些广泛使用的习惯用法来删除未在 makefile 中指定的库成员,但我找不到任何东西。显然,你可以制定clean规则,比如

clean :
    rm -f $(LIB)

并在您更改文件名或删除某些文件等时调用它,但是由于我们编写 makefile 的目的是仅编译更改的内容,因此我认为该解决方案不好。处理这种情况的好方法是什么?

标签: cmakefile

解决方案


推荐阅读