首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >makefile中的*.o/.后缀是什么意思?

makefile中的*.o/.后缀是什么意思?
EN

Stack Overflow用户
提问于 2010-01-06 12:18:10
回答 5查看 19.6K关注 0票数 21

我在Makefiles中看到过类似这样的命令,但我不太理解:

代码语言:javascript
代码运行次数:0
运行
复制
vpath.o: make.h config.h getopt.h gettext.h dep.h

代码语言:javascript
代码运行次数:0
运行
复制
.SUFFIXES:
.SUFFIXES:  .f  .o
#
# %------------------%
# | Default command. |
# %------------------%
#
.DEFAULT:
    @$(ECHO) "Unknown target $@, try:  make help"
#
# %-------------------------------------------%
# |  Command to build .o files from .f files. |
# %-------------------------------------------%
#
.f.o:
    @$(ECHO) Making $@ from $<
    @$(FC) -c $(FFLAGS) $<

*.o*.suffixes是什么意思?

注意:这两个命令来自脚本的不同部分。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-06 13:04:17

你问题的第一行只是一个标准的Makefile规则。

代码语言:javascript
代码运行次数:0
运行
复制
vpath.o: make.h config.h getopt.h gettext.h dep.h

.o文件是一个目标文件;它是源文件和最终编译的二进制文件之间的中间产品。它包含已编译的代码,但尚未链接到一个完整的库或二进制文件中。这条规则只说明vpath.o依赖于make.hconfig.h等,每次更改时,都应该重新编译。构建vpath.o所需的命令应紧跟在后续行之后,并以制表符缩进。(如果我重复了您已经知道的内容,很抱歉;我不确定您对第一行中的哪部分感到困惑)。

.SUFFIXES并不是指实际的文件后缀;它只是makefile中的一种特殊规则,用于配置“后缀规则”。

后缀规则是.a.b形式的规则,就像您在.f.o规则中看到的那样。它们是一种告诉make的方式,只要您看到.f文件(源文件),就可以遵循该规则从该文件生成.o文件(目标文件),其中$<表示源文件,$@表示目标文件。

.SUFFIXES“目标”是一种定义可以在后缀规则中使用的后缀的方法。在没有先决条件的情况下使用时,它会清除内置的后缀列表;当与先决条件一起使用时,它会将这些后缀添加到它的已知后缀列表中,这些后缀可能会在后缀规则中使用。

在GNU make中,您可以使用更强大、更清晰的%来形成模式规则,例如:

代码语言:javascript
代码运行次数:0
运行
复制
%.o: %.c
    gcc -c -o $@ $<

这相当于后缀规则:

代码语言:javascript
代码运行次数:0
运行
复制
.c.o:
    gcc -c -o $@ $<

有关更多信息,请参阅GNU Make documentation (但其中也提到了GNU扩展),或者参阅Single Unix Specification/POSIX了解通用的、可移植的语法。

票数 30
EN

Stack Overflow用户

发布于 2010-01-06 13:33:07

如前所述,这行代码

.SUFFIXES:

会删除所有已知的后缀。这样做的目的是为了:

中造成混淆或不当行为。

如果您正在使用GNU,最好使用模式规则而不是后缀规则,因为它们(后缀规则)是为了兼容性而存在的,reasons.Also后缀规则不能有自己的先决条件。

因此,您将重写表单的后缀规则:

.f.o:

..。

作为表单的模式规则:

%.o:%.f:

..。

请注意,在后缀规则中,先决条件前缀排在第一位,目标后缀排在第二位,而对于模式规则,则是相反的(并且不那么容易混淆)。

如果您计划更多地使用makefile,也可以查看在线提供的Managing Projects with GNU Make一书。

票数 4
EN

Stack Overflow用户

发布于 2010-01-06 12:21:10

Makefile语法很微妙,很容易激怒。我可能会建议你看看documentation for make,特别是关于suffix rules的部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2010926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档