我在Makefiles中看到过类似这样的命令,但我不太理解:
vpath.o: make.h config.h getopt.h gettext.h dep.h
和
.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
是什么意思?
注意:这两个命令来自脚本的不同部分。
发布于 2010-01-06 13:04:17
你问题的第一行只是一个标准的Makefile规则。
vpath.o: make.h config.h getopt.h gettext.h dep.h
.o
文件是一个目标文件;它是源文件和最终编译的二进制文件之间的中间产品。它包含已编译的代码,但尚未链接到一个完整的库或二进制文件中。这条规则只说明vpath.o
依赖于make.h
、config.h
等,每次更改时,都应该重新编译。构建vpath.o
所需的命令应紧跟在后续行之后,并以制表符缩进。(如果我重复了您已经知道的内容,很抱歉;我不确定您对第一行中的哪部分感到困惑)。
.SUFFIXES
并不是指实际的文件后缀;它只是makefile中的一种特殊规则,用于配置“后缀规则”。
后缀规则是.a.b
形式的规则,就像您在.f.o
规则中看到的那样。它们是一种告诉make
的方式,只要您看到.f
文件(源文件),就可以遵循该规则从该文件生成.o
文件(目标文件),其中$<
表示源文件,$@
表示目标文件。
.SUFFIXES
“目标”是一种定义可以在后缀规则中使用的后缀的方法。在没有先决条件的情况下使用时,它会清除内置的后缀列表;当与先决条件一起使用时,它会将这些后缀添加到它的已知后缀列表中,这些后缀可能会在后缀规则中使用。
在GNU make
中,您可以使用更强大、更清晰的%
来形成模式规则,例如:
%.o: %.c
gcc -c -o $@ $<
这相当于后缀规则:
.c.o:
gcc -c -o $@ $<
有关更多信息,请参阅GNU Make documentation (但其中也提到了GNU扩展),或者参阅Single Unix Specification/POSIX了解通用的、可移植的语法。
发布于 2010-01-06 13:33:07
如前所述,这行代码
.SUFFIXES:
会删除所有已知的后缀。这样做的目的是为了:
中造成混淆或不当行为。
如果您正在使用GNU,最好使用模式规则而不是后缀规则,因为它们(后缀规则)是为了兼容性而存在的,reasons.Also后缀规则不能有自己的先决条件。
因此,您将重写表单的后缀规则:
.f.o:
..。
作为表单的模式规则:
%.o:%.f:
..。
请注意,在后缀规则中,先决条件前缀排在第一位,目标后缀排在第二位,而对于模式规则,则是相反的(并且不那么容易混淆)。
如果您计划更多地使用makefile,也可以查看在线提供的Managing Projects with GNU Make一书。
发布于 2010-01-06 12:21:10
Makefile
语法很微妙,很容易激怒。我可能会建议你看看documentation for make,特别是关于suffix rules的部分。
https://stackoverflow.com/questions/2010926
复制相似问题