提问人:Roland Tóbiás 提问时间:11/7/2023 最后编辑:Roland Tóbiás 更新时间:11/8/2023 访问量:57
如何使用 Makefile 将目标文件放入不同的目录中?
How to place object files into a different directory using Makefile?
问:
请考虑以下 Makefile 片段:
FORTRAN = ifort -c
PATH_MOD = mod/
FILE_MOD = mod_constant.f90 mod_rot.f mod_test.f90
SOURCE_MOD = $(FILE_MOD:%=$(PATH_MOD)%)
OBJECT_MOD = $(FILE_MOD:%.f*=%.o)
$(OBJECT_MOD): $(SOURCE_MOD)
$(FORTRAN) $(SOURCE_MOD)
clean:
rm -f *.o
此脚本执行命令 。ifort -c mod_constant.f90 mod_rot.f mod_test.f90
但是,我想实现 [但没有目录中的其他文件] 中列出的所有文件都将在单独的行中编译,将目标文件放入目录中。
在本例中,脚本应运行以下命令序列:$(FILE_MOD)
$(PATH_MOD)$
lnk
ifort -c mod_constant.f90 -o lnk/mod_constant.o
ifort -c mod_rot.f -o lnk/mod_rot.o
ifort -c mod_test.f90 -o lnk/mod_test.o
有什么办法可以做到这一点吗?
答:
这条规则...
$(OBJECT_MOD): $(SOURCE_MOD) $(FORTRAN) $(SOURCE_MOD)
表示要扩展到的列表中的每个目标都具有要扩展到的列表中的所有文件作为先决条件,并且应由要扩展到的命令生成。那根本不是你想要的。$(OBJECT_MOD)
$(SOURCE_MOD)
$(FORTRAN) $(SOURCE_MOD)
我想实现 [但没有目录中的其他文件] 中列出的所有文件都将在单独的行中编译,将目标文件放入目录中。
$(FILE_MOD)
$(PATH_MOD)$
lnk
既然你似乎已经对GNU的版本做出了承诺,那么自然的方法是编写一个模式规则。实际上,或者两个,因为您有两种不同的源名称模式。如果您希望目标文件进入与其相应源不同的目录,那么这也将在此类规则中处理。例如make
lnk/%.o : %.f
$(FORTRAN) -c $< -o $@
lnk/%.o : %.f90
$(FORTRAN) -c $< -o $@
可以解释为通配符,但需要注意的是,规则目标中的外观和其先决条件列表中的外观必须扩展为同一字符串。%
是一个自动变量,它扩展到规则的先决条件列表的第一个实际元素,但要扩展 。扩展到正在构建的实际目标。$<
%
$@
另外,请注意,这些规则告诉了如何构建想要的文件,但您仍然需要以某种方式告诉它们需要构建。这通常是通过使它们成为某些规则的先决条件,尽管您可以改为依赖于从命令行显式请求其中的一个或多个规则。make
make
评论
lnk/%.o : %.f*
$(FORTRAN) -c $< -o $@
$(OBJECT_MOD)/$(SOURCE_MOD)
$(OBJECT_MOD): $(SOURCE_MOD)
all: $(OBJECT_MOD)
.f
.f90
make
make
OBJECT_MOD
lnk/
评论
OBJECT_MOD
SOURCE_MOD
ls *.f