我有一个makefile。
我需要在src1和src2下的源文件下在C:/ bin /下构建一组目标。
让他们在订单中被要求
$ {DEST_DIR} /a.o $ {DEST_DIR} /b.o $ {DEST_DIR} /c.o $ {DEST_DIR} /d.o
在makefile的某些部分
DEST_DIR = C:/ bin
SRC_DIR1 = C:/ src1
SRC_DIR2 = C:/ src2
我的规则如下
#规则#1
$ {DEST_DIR} /%.o:$ {SRC_DIR1} /%。c
#the command required to build the target
echo "Source: $< Target: $@ "
#规则#2
$ {DEST_DIR} /%.o:$ {SRC_DIR2} /%。c
#the command required to build the target
echo "Source: $< Target: $@ "
让a.c和b.c在SRC_DIR1中,c.c和d.c在SRC_DIR2中
当我构建它时,为a.o和b.o建立规则#1,然后将规则#2替换为c.o和d.o
我没想到会没事的。因为我期望它为c.o的规则#1而且抛出一个错误,说“没有规则来制作目标c.c”。但它适用于规则#2并在SRC_DIR2中从c.c构建c.o。
有人可以解释一下它的运作方式吗?在这种情况下外卡字符%
如何工作以及如何进行规则匹配?
答案 0 :(得分:1)
Make不会允许两组命令,例如a.o,但即使目标模式完全相同,也会允许重叠模式规则。
当您要求c.o时,由于“c.o”没有特定规则,因此请查看匹配的模式规则。从the GNU make manual开始:“为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(在模式替换之后)必须命名存在或可以创建的文件。”所以第一条规则不适用,并且继续前进到第二条规则,即确实如此。