所以我正在学习makefile,但是$<和$?我真的很困惑。说到这个,$ @也让我感到困惑。
如果有多个目标,那么$ @引用的是什么,第一个?如果你想引用第二个目标,你刚刚搞砸了怎么办?
使用$<,我的老师告诉我它指的是当前的先决条件。然而,他在幻灯片中有一个例子如下:
.SUFFIXES: .c .o .cxx
.c.o:;$(CC) $(CFLAGS) -c $<
.cxx.o:; $(CXX) $(CXXFLAGS) -c $<
这对我没有任何意义。怎么可以$&lt;如果没有依赖关系,请参考什么?在第2行和第3行中没有任何依赖关系。
至于$?我知道这是较新的先决条件清单,这对我来说只是一个行话。
感谢任何帮助人员,我在过去一小时内尝试过google,但这一切都在同一篇简短的UNIX演讲中,这对我来说有点难以理解。
编辑:我应该补充一下,我对第2行和第3行中的符号感到困惑。在每一行的开头,每个后缀(.co和.cxx)是什么意思.o分别挤在一起,没有任何空格?
答案 0 :(得分:3)
首先,要意识到make不是在运行程序。 make文件是一组推理规则。
你告诉你如何将一件事变成另一件事,然后给它一个目标。然后它将您的推理规则组合在一起以确定步骤,并沿途检查文件的时间戳,以确保它不会重复不需要的工作。
SUFFIXES告诉make应该在文件上识别哪些后缀。
列出两个后缀的规则:.c.o表示采用带有.c后缀的SINGLE文件的规则,并将其转换为带有.o后缀的SINGLE文件。
cc -c x.c
构建x.o.所以,
.c.o:
<TAB>cc -c $<
说“使用$&lt;中的任何源文件,并使用此命令将其转换为.o文件”
然后你可以制定这样的规则:
mycmd: x.o y.o z.o
<TAB>cc -o $@ $^
如果当前目录中有三个c文件(xc,yc和zc),make将能够推断出当你想创建mycmd时,它需要.o文件,它知道它可以使.o来自.c,所以它会。
特殊变量定义在此处:http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
因此,当您键入(在命令行)时:
make mycmd
查看规则列表并看到:OH,要做到这一点,我需要x.o,y.o和z.o 然后它进入磁盘。说它找到x.c,x.o,y.c和z.c.现在它认为:
我有x.o ...但.o文件是由.c文件制作的...我应该检查来源是否已更改。它检查时间戳,如果.c文件比.o文件新,则重建它。
对于y.c和z.c,它知道它可以使用cc将它们转换为.o文件。
假设x.o比x.c更新,make将:
cc -c y.c
cc -c z.c
cc -o myprog x.o y.o z.o
如果你再次运行make,它会执行相同的步骤,但这一次发现myprog比所有.o文件都新。这些文件都比.c文件更新...所以它什么也没做。< / p>
现在,假设您编辑xc并再次运行make:它将再次完成整个检查序列,发现xc比xo更新,所以它将重建它,然后它会注意到mycmd现在更旧了比xo,所以它会重新链接它。
因此,对于非常短的规则集,您可以完成大量的工作。