0

我有一个生成文件。

我需要从 src1 和 src2 下的源文件在 C:/bin/ 下构建一组目标。

让他们按顺序说

${DEST_DIR}/ao ${DEST_DIR}/bo ${DEST_DIR}/co ${DEST_DIR}/do

在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: $@ "

让 ac 和 bc 在 SRC_DIR1 中, cc 和 dc 在 SRC_DIR2 中

当我构建它时,它构建得很好,为 ao 和 bo 执行规则#1,然后为 co 执行规则#2 并执行

我没想到会没事。因为我期待它适用于 co 的规则#1 并抛出一个错误,说“没有规则来制作目标 cc”。但它适用于规则#2,并从 SRC_DIR2 中的 cc 构建 co。

有人可以解释一下它是如何工作的吗?在这种情况下,通配符如何%工作以及规则匹配如何发生?

4

1 回答 1

1

Make 不允许使用两组命令,例如 ao,但即使目标模式完全相同,它也会允许重叠模式规则。

当您要求 co 时,由于“co”没有特定的规则,因此请通过模式规则查找匹配项。来自GNU make 手册:“为了应用模式规则,它的目标模式必须与所考虑的文件名匹配,并且它的所有先决条件(在模式替换之后)必须命名存在或可以制作的文件。” 所以第一条规则不适用,然后继续第二条,它确实适用。

于 2009-09-09T15:15:11.150 回答