我有一个GNU-make makefile (gcc v4.1.2)的一部分,它不能像我预期的那样工作。如果在基本/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‘成为'all’所需的。停止”。但我认为%.a : $(LIB_DIR)/%.a行可以处理这个问题。我的模式规则是不正确的吗?
如果我尝试注释掉的第二个all:行,它会像预期的那样工作。
发布于 2012-08-10 05:12:04
问题出在这里:
%.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)https://stackoverflow.com/questions/11890671
复制相似问题