任何人都可以解释为什么使用$<在:
$(BUILD_DIR)/release/%.o: %.c $(HEADERS)
$(RELEASE_LINK.c) $< -c -o $@
迭代遍历.o文件和.c文件,从c文件构建obj文件,而$&lt;在:
$(program_C_OBJS) : $(program_C_SRCS)
$(RELEASE_LINK.c) $< -c -o $@
迭代所有obj文件,但只能拉出第一个依赖项,即第一个c文件
在第二个例子中是否可以修改obj和c文件的匹配对,如第一个例子所示?
答案 0 :(得分:1)
来自GNU Make - 10.5.3 Automatic Variables
$&LT;
添加的第一个先决条件
第一个先决条件的名称。如果目标从隐式规则获得其配方,这将是隐式规则
根据您想要完成的内容,还有
$?
比目标更新的所有先决条件的名称,它们之间有空格 $ ^
所有先决条件的名称,它们之间有空格
您可以通过将它们声明为对另一个目标的依赖性来构建一组特定的对象
target1: $(program_C_OBJS)
现在,当你打电话
make target1
make
尝试为target1
创建依赖项,而$(program_C_OBJS)
又可以使用您的第一条规则逐个构建。当然,您也可以为target1指定命令。只要构建了依赖项{{1}},就会执行此命令。
答案 1 :(得分:1)
$<
变量不会“迭代”任何内容。它没有做任何事情,只是扩展到扩展目标的第一个先决条件的名称。
第一条规则是模式规则。它适用于需要构建的与该模式匹配的任何文件。
第二条规则(除了那些变量包含模式之外,几乎肯定不会像你想要的那样做什么)将特定的输出文件映射到特定的输入文件(在你的情况下可能是你想要的有限输入C文件集)规则适用于)。
在任何给定的make运行期间对哪些文件进行编译的选择取决于告诉构建哪些文件以及哪些依赖项确定需要更新才能实现。