【问题标题】:how do wild character % work in makefile rules通配符 % 如何在 makefile 规则中工作
【发布时间】:2009-09-09 07:43:06
【问题描述】:

我有一个生成文件。

我需要从 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

我有他们的规则如下

#rule#1

${DEST_DIR}/%.o : ${SRC_DIR1}/%.c

  #the command required to build the target
  echo "Source: $< Target: $@ "

#rule#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,c.o 和 d.o 的规则#2

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

谁能解释一下它是如何工作的?在这种情况下,通配符% 是如何工作的?如何进行规则匹配?

【问题讨论】:

    标签: build makefile target rules


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多