0

我有一部分 GNU-make makefile (gcc v4.1.2) 没有按我的预期工作。make我在子目录中有四个库,如果在基本 /build 目录中运行,我想递归构建它们

/prj
|--/build
|  |--makefile
|  |--/Tables.lib
|  |  |--makefile
|  |--/General.lib
|  |  |--makefile (etc..)
|--/lib
|--/src

/prj/build/makefile 的简要代码:

LIB_DIR = /prj/lib

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a
DIRS := Tables.lib Composition_adjustment.lib General.lib Biblio.lib

all: $(LIBRARY)
#all: $(LIB_DIR)/libcomposition_adjustment.a # this line works

%.a : $(LIB_DIR)/%.a

$(LIB_DIR)/libtables.a:
    cd Tables.lib; $(MAKE)

$(LIB_DIR)/libcomposition_adjustment.a:
    cd Composition_adjustment.lib; $(MAKE)

$(LIB_DIR)/libgeneral.a:
    cd General.lib; $(MAKE)

$(LIB_DIR)/libbiblio.a: libgeneral.a
    cd Biblio.lib; $(MAKE)

它说“没有规则来制作'all'需要的目标'libcomposition_adjustment.a'。停止”。但我认为这条线%.a : $(LIB_DIR)/%.a会处理这个问题。我错误地制定了这个模式规则?

all:如果我尝试注释掉的第二行,它会按预期工作。

4

1 回答 1

3

问题在这里:

%.a : $(LIB_DIR)/%.a

这是一个没有命令的模式规则,Make 根本不会将其解释为独立规则。解决这个问题的方法不止一种;最简单的可能是给它一个什么都不做的命令:

%.a : $(LIB_DIR)/%.a
    @:

但更好的方法是完全不使用有问题的规则:

LIB_DIR = /prj/lib

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a
LIBRARY := $(addprefix $(LIB_DIR)/,$(LIBRARY))

all: $(LIBRARY)

$(LIB_DIR)/libtables.a:
    cd Tables.lib; $(MAKE)

$(LIB_DIR)/libcomposition_adjustment.a:
    cd Composition_adjustment.lib; $(MAKE)

$(LIB_DIR)/libgeneral.a:
    cd General.lib; $(MAKE)

$(LIB_DIR)/libbiblio.a: $(LIB_DIR)/libgeneral.a
    cd Biblio.lib; $(MAKE)
于 2012-08-09T21:12:03.690 回答