对象文件"* .o"的自动排序.在Fortran Makefile中 [英] Automatic Ordering of Object Files "*.o" in a Fortran Makefile
问题描述
这里有两个Fortran90文件和一个makefile:
Here I have two Fortran90 files and a makefile:
文件内容 main_mod.f90 :
module main_mod
contains
subroutine add(a, b)
implicit none
integer, intent(in) :: a, b
print *, (a+b)
end subroutine add
end module main_mod
文件内容 main_mod2.f90
module main_mod2
use main_mod
contains
subroutine add2(a, b)
implicit none
integer, intent(in) :: a, b
call add(a, b)
end subroutine add2
end module main_mod2
并在 makefile 中,我自动从当前目录中生成".o"文件列表:
and in makefile, I automatically generate a list of ".o" files from current directory:
F90 = /usr/bin/gfortran
COMPFLAGS = -c
%.o: %.f90
$(F90) $(COMPFLAGS) $*.f90
all: $(patsubst %.f90,%.o,$(wildcard *.f90))
在创建项目时,make文件中的通配符语句会生成目标文件列表,例如:
when I make the project, the wildcard statement in my make file generates a list of object files like:
main_mod2.o main_mod.o
,然后编译失败,因为首先需要编译文件 main_mod.f90 ,这会给我们 main_mod.o 和 main_mod.mod 在 main_mod2.f90 中使用.这样, main_mod2.f90 将成功编译.这意味着目标文件的排列必须为:
and then the compilation fails because first, the file main_mod.f90 needs be compiled which would give us main_mod.o and main_mod.mod used in main_mod2.f90. Then main_mod2.f90 would be compiled successfully. That means the permutation of object files must be:
main_mod.o main_mod2.o
现在,问题是,在通常情况下,当我使用通配符创建目标文件列表时,如何强制对目标文件进行正确排列?
Now, the question is, in general case when I create the list of object files using wildcard, how can I enforce correct permutation of object files?
推荐答案
尽管gcc确实具有-M
和相关标志以用于C/C ++文件,但不幸的是,它们不适用于gfortran.实际上,这是可能的,但前提是您已经知道依赖关系.
因此,您将需要一个外部程序来生成依赖项.
While gcc does have -M
and related flags for doing exactly this with C/C++ files, they unfortunately do not work with gfortran. Actually, it is possible, but only if you already know the dependencies.
Therefore you will need an external program to generate your dependencies.
在我的项目中,我使用此python脚本,并将以下内容添加到我的makefile中:
In my projects, I use this python script, and add the following to my makefile:
# Script to generate the dependencies
MAKEDEPEND=/path/to/fort_depend.py
# $(DEP_FILE) is a .dep file generated by fort_depend.py
DEP_FILE = my_project.dep
# Source files to compile
OBJECTS = mod_file1.f90 \
mod_file2.f90
# Make sure everything depends on the .dep file
all: $(actual_executable) $(DEP_FILE)
# Make dependencies
.PHONY: depend
depend: $(DEP_FILE)
# The .dep file depends on the source files, so it automatically gets updated
# when you change your source
$(DEP_FILE): $(OBJECTS)
@echo "Making dependencies!"
cd $(SRCPATH) && $(MAKEDEPEND) -w -o /path/to/$(DEP_FILE) -f $(OBJECTS)
include $(DEP_FILE)
fort_depend.py
基本上只是列出给定文件中所有模块USE
d的列表.
fort_depend.py
basically just makes a list of all the modules USE
d in a given file.
这篇关于对象文件"* .o"的自动排序.在Fortran Makefile中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!