1

所以我正在学习 makefile,但是 $< 和 $? 真的让我很困惑。说到这, $@ 也让我感到困惑。

如果有多个目标怎么办,那么 $@ 指的是什么,第一个呢?如果你想引用第二个目标怎么办,你是不是被搞砸了?

使用 $<,我的老师告诉我它指的是当前的先决条件。但是,他的幻灯片中有一个示例,如下所示:

.SUFFIXES: .c .o .cxx

.c.o:;$(CC) $(CFLAGS) -c $<

.cxx.o:; $(CXX) $(CXXFLAGS) -c $<

这对我来说没有任何意义。如果没有依赖关系, $< 怎么能引用任何东西?在第 2 行和第 3 行中,没有任何依赖项。

至于美元?去,我听说这是更新的先决条件列表,这对我来说只是行话。

感谢大家的帮助,我在过去一个小时里尝试了谷歌,但它都是在同一个简洁的 UNIX 语音中,我有点难以理解。

编辑:我应该补充一下,我对第 2 行和第 3 行中的符号感到困惑。在每一行的开头,将每个后缀(分别为 .co 和 .cxx.o)挤在一起意味着什么空间?

4

1 回答 1

3

首先,意识到 make 不是在运行程序。make 文件是一组推理规则。

你告诉 make 如何将一件事变成另一件事,然后给它一个目标。然后它将您的推理规则组合在一起以找出步骤,并在此过程中检查文件上的时间戳以确保它不会重复不必要的工作。

SUFFIXES 告诉 make 应该在文件上识别哪些后缀。

列出两个后缀的规则: .co 表示将带有 .c 后缀的 SINGLE 文件转换为带有 .o 后缀的 SINGLE FILE 的规则。

cc -c x.c

构建 xo 所以,

.c.o:
<TAB>cc -c $<

说“获取 $< 中的任何源文件,并使用此命令将其转换为 .o 文件”

然后你可以制定这样的规则:

mycmd: x.o y.o z.o
<TAB>cc -o $@ $^

如果当前目录中有三个 c 文件(xc、yc 和 zc),make 将能够推断出当您要制作 mycmd 时,它需要 .o 文件,并且它知道可以从.c,所以它会的。

特殊变量定义在这里:http ://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

因此,当您键入(在命令行)时:

make mycmd

make 浏览规则列表并看到: 哦,要做到这一点,我需要 xo、yo 和 zo 然后它进入磁盘。假设它找到了 xc、xo、yc 和 zc 现在它认为:

我有 xo ..但是 .o 文件是由 .c 文件制成的...我应该检查源是否已更改。它检查时间戳,如果 .c 文件比 .o 文件新,它会重建它。

对于 yc 和 zc,它知道可以使用 cc 将它们转换为 .o 文件。

假设 xo 比 xc 更新,make 将:

cc -c y.c
cc -c z.c
cc -o myprog x.o y.o z.o

如果您再次运行 make,它会执行相同的步骤,但这次发现 myprog 比所有 .o 文件都新,而所有 .o 文件都比 .c 文件新……所以它什么也不做。

现在,假设您编辑 xc 并再次运行 make:它将再次检查整个序列,发现 xc 比 xo 新,因此它将重建它,然后它会注意到 mycmd 现在比 xo 旧,所以它会重新链接它。

因此,对于一组非常短的规则,您可以为您完成很多工作。

于 2012-10-18T03:51:39.430 回答