Makefile中的*.o/.suffix是什么意思?

Makefile中的*.o/.suffix是什么意思?,makefile,Makefile,我在makefile中看到过这样的命令,我不太理解: vpath.o: make.h config.h getopt.h gettext.h dep.h 及 。后缀: .后缀:.f.o # # %------------------% #|默认命令| # %------------------% # .默认值: @$(ECHO)“未知目标$@,请尝试:生成帮助” # # %-------------------------------------------% #|从.f文件生成.o文件的命令

我在makefile中看到过这样的命令,我不太理解:

vpath.o: make.h config.h getopt.h gettext.h dep.h

。后缀:
.后缀:.f.o
#
# %------------------%
#|默认命令|
# %------------------%
#
.默认值:
@$(ECHO)“未知目标$@,请尝试:生成帮助”
#
# %-------------------------------------------%
#|从.f文件生成.o文件的命令|
# %-------------------------------------------%
#
.f.o.:
@$(ECHO)从$<
@$(FC)-c$(FFLAGS)$<
*.o
*.suffix
是什么意思


注意:这两个命令来自脚本的不同部分。
Makefile
语法很微妙,很快就会发怒。我可能建议看一看,特别是关于的部分。

第一行
。后缀
清除了所有关于“内置”后缀的知识;第二个恢复后缀
.f
(传统的Fortran)和
.o
(对象文件)。当不能使用任何其他规则时,将使用
.DEFAULT
规则。最后一条规则使用
$(FC)
编译器将
.f
文件编译成
.o
文件。
@
意味着不回显命令,这让我很恼火(我更喜欢看到用于编译的命令)


我在makefile摘录中看不到
*。后缀
,因此我无法告诉您它的意思。

您问题的第一行只是一条标准的makefile规则

vpath.o: make.h config.h getopt.h gettext.h dep.h
.o
文件是一个对象文件;它是介于源文件和最终编译的二进制文件之间的中间产品。它包含已编译的代码,但尚未链接到一个完整的库或二进制文件中。这条规则只是说,
vpath.o
依赖于
make.h
config.h
等,每次更改它们时,都应该重新编译。生成
vpath.o
所需的命令应紧跟其后,并用制表符缩进。(如果我重复了你已经知道的内容,请道歉;我不确定你对第一行的哪一部分感到困惑)

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


后缀规则是
.a.b
形式的规则,如您的
.f.o
规则所示。它们是告诉
make
的一种方式,即每当您看到
.f
文件(源文件)时,您可以根据该规则从中生成
.o
文件(目标文件),其中
$如前所述行
.后缀:
将删除所有已知的后缀。这样做是为了:

  • 默认后缀不会干扰您的特殊后缀。
  • 不同的make程序具有不兼容的后缀列表和隐式规则, 这有时会造成混乱或行为不端
如果您使用的是GNU make,那么最好使用模式规则而不是后缀规则 因为它们(后缀规则)的存在是出于兼容性的原因。此外,后缀规则不能具有 他们自己的先决条件

所以你要重写形式的后缀规则:

.f.o:

作为表单的模式规则:

%.o:%.f:

请注意,在后缀规则中,先决条件前缀排在第一位,目标后缀排在第二位,与模式规则一样,情况正好相反(而且不太容易混淆)

如果您计划更多地使用makefiles,也可以查看这本书
可在线获取。

您也可以使用后缀链规则,例如在以下规则中,从gnuplot文件生成tex-then-pdf:

.SUFFIXES: .plt .tex .pdf

# (notice that there should be tabs prefixing the lines after the rule)
%.tex: %.plt
gnuplot -e " \
set format '$$%g$$' ; \
set terminal epslatex standalone color ; \
set output '$@' \
" $<

%.pdf: %.tex
pdflatex $<

all: test.pdf
后缀:.plt.tex.pdf
#(请注意,规则后面的行前面应该有制表符)
%.tex:%.plt
gnuplot-e“\
设置格式“$$%g$$”\
设置终端颜色\
设置输出“$@”\
" $<
%.pdf:%.tex
pdflatex$<
全部:test.pdf

是的;%语法可以说更简洁,更强大。除了GNU make之外,它还受到其他make版本的支持(我知道Digital Mars make支持它)。
%.o: %.c
    gcc -c -o $@ $<
.c.o:
    gcc -c -o $@ $<
.SUFFIXES: .plt .tex .pdf

# (notice that there should be tabs prefixing the lines after the rule)
%.tex: %.plt
gnuplot -e " \
set format '$$%g$$' ; \
set terminal epslatex standalone color ; \
set output '$@' \
" $<

%.pdf: %.tex
pdflatex $<

all: test.pdf