【问题标题】:Confused About UNIX Makefile $< and $?对 UNIX Makefile $< 和 $? 感到困惑
【发布时间】:2012-10-08 10:36:43
【问题描述】:

所以我正在学习 makefile,但是 $

如果有多个目标怎么办,那么 $@ 指的是什么,第一个?而如果你想引用第二个目标,你就完蛋了吗?

使用 $

.SUFFIXES: .c .o .cxx

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

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

这对我来说没有任何意义。如果没有依赖关系, $

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

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

编辑:我应该补充一下,我对第 2 行和第 3 行中的符号感到困惑。在每一行的开头,每个后缀(.co 和 .cxx)是什么意思.o 分别)像这样挤在一起没有任何空格?

【问题讨论】:

  • .c.o 的意思是“这是将 .c 文件转换为 .o 文件的规则”
  • 首先make是如何到达那条线的?

标签: unix makefile dependencies target


【解决方案1】:

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

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

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

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

cc -c x.c

构建 x.o.所以,

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

表示“获取 $

那么你可以制定这样的规则:

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

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

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

所以,当你输入(在命令行):

make mycmd

make 浏览规则列表并看到:哦,要做到这一点,我需要 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 文件都新,而所有 .o 文件都比 .c 文件新……所以它什么也不做。

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

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

【讨论】:

  • 那么我最初发布的程序实际上并没有自己做任何事情?它只是告诉make,如果它确实需要转换文件,这是这样做的方法吗?我对您的第三个代码部分感到困惑,它不是 $
  • 我想我现在的变量是正确的......自从我写了一个 makefile 已经有一段时间了......不得不再次查找它们。
  • 你发布的makefile没有明确的目标,所以“make”不会做任何事情;但是,它可以构建单文件项目。例如。如果当前目录中有 x.c,请尝试“make x.o”甚至“make x”。 Make 可以处理单个文件,而无需为其指定明确的规则。
  • 这真的很清楚,谢谢。我自己要花一些时间才能解决这个问题,你说得非常直截了当。
  • 你现在的作业是:让 make 做一些奇怪的构建......例如教它如何将 .txt 文件转换为 .pdf(如果安装了 text2pdf,则使用 text2pdf),或将 .gif 格式的图像转换为 .jpg(例如,使用 netpbm 命令行工具)。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2014-11-02
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多