将库作为 makefile 中的依赖项与没有依赖项符号有什么区别

What's the difference between having a library as a dependency in a makefile vs without the dependency symbol

我对 makefile 很陌生,我想知道这种格式的库到底有什么作用:

app: app.o mylibrary.a
$(LD) -o $@ $(LDFLAGS) app.o mylibrary.a

我通常看到的是这样的:

app: app.o
$(LD) -o app $(LDFLAGS) $^ mylibrary.a

我对这种格式的理解是,可执行文件将从 app.o 文件生成,该文件依赖于 mylibrary.a.

虽然第一个版本的difference/meaning我不太明白。

其中 $@ 是目标被替换的地方,在第一种情况下是 app.

虽然问题中没有定义它们,但 $(LD)$(CFLAGS) 通常被定义为 c-compiler 和在编译器中使用的标志。 例如。 CFLAGS = -g -Wall -std=c99 -lstdc++ 之类的东西将是 Makefile 顶部的定义行。 我通常将这些作为目标的 运行 命令的前两部分编写。

$^ 表示替换所有列为目标依赖项的内容。在第一行中,依赖项是 app.o mylibrary.a,而在第二行中,它只是 app.o。这些($^$@)通常用来简化make规则的写法。 选择是否使用wildcards-as这些called-is真的是你自己的选择。我通常使用它们,因为它们更易于编写和维护。

因此,要回答您的问题,主要区别在于您明确 需要放置文件名的位置。

关于依赖项的补充说明 make 使用列出目标依赖项的行中的文件来确定需要重新 运行 的目标。 Make 对依赖关系进行拓扑排序,如果某些东西 changes-based 在 file-the 的最后一次触摸时间 make 命令将重新 运行 目标,如果它在 make 目标的路径内打电话。