我有一部分GNU-make makefile(gcc v4.1.2)没有像我预期的那样工作。我在sub diretiories中有四个库,如果在base / build目录中运行make
,我想以递归方式构建
/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)
它说“没有规则要制作目标'libcomposition_adjustment.a',需要'全'。停止”。但我认为%.a : $(LIB_DIR)/%.a
行会处理这个问题。我错误地制作了这种模式规则吗?
如果我尝试注释掉的第二条all:
行,它会按预期工作。
答案 0 :(得分:2)
问题在于:
%.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)