【问题标题】:Pattern Rule is not working as expected模式规则未按预期工作
【发布时间】:2012-08-09 19:33:58
【问题描述】:

我有一部分 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: 行,它会按预期工作。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    问题出在这里:

    %.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)
    

    【讨论】:

    • 谢谢,它必须做“某事”,即使它什么都不做也是有道理的。
    猜你喜欢
    • 2018-08-12
    • 2013-07-24
    • 2013-08-11
    • 2019-03-15
    • 2014-07-15
    • 2020-01-12
    • 2020-10-30
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多