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