将库作为 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 目标的路径内打电话。
我对 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 目标的路径内打电话。