0

谁能解释为什么使用 $< 在:

$(BUILD_DIR)/release/%.o: %.c $(HEADERS)
    $(RELEASE_LINK.c) $< -c -o $@

成对遍历 .o 文件和 .c 文件,从 ac 文件构建 obj 文件,而 $< 在:

$(program_C_OBJS) : $(program_C_SRCS)
    $(RELEASE_LINK.c) $< -c -o $@

遍历所有 obj 文件,但只提取第一个依赖项,即第一个 c 文件

是否可以在第二个示例中进行修改,以便像第一个示例中那样构建匹配的 obj 和 c 文件对?

4

2 回答 2

1

来自GNU Make - 10.5.3 自动变量

$<
第一个先决条件的名称。如果目标从隐式规则中获得其配方,这将是隐式规则添加的第一个先决条件

根据您要完成的任务,还有

美元?
比目标新的所有先决条件的名称,它们之间有空格。
$^
所有先决条件的名称,它们之间有空格

您可以通过将它们声明为对另一个目标的依赖来构建一组特定的对象

target1: $(program_C_OBJS)

现在,当你打电话

make target1

make尝试创建依赖target1项,而这些依赖项又可以使用您的第一条规则一个一个地构建。当然,您也可以为 target1 指定命令。此命令将在其依赖$(program_C_OBJS)项构建后立即执行。

于 2013-11-04T14:18:01.883 回答
1

$<变量不会“迭代”任何东西。它什么也不做,只是扩展到它所扩展的目标的第一个先决条件的名称。

第一条规则是模式规则。它适用于需要构建的与该模式匹配的任何文件。

第二条规则(除非这些变量包含模式,否则几乎可以肯定它不会像您想要的那样做任何远程操作)将特定的输出文件映射到特定的输入文件(在您的情况下,大概是您希望规则应用的有限输入 C 文件集至)。

在任何给定的 make 运行期间编译哪些文件的选择取决于 make 被告知要构建哪些文件,以及它们的哪些依赖项 make 决定需要更新以实现这一点。

于 2013-11-04T15:12:31.343 回答