编译fortran90模块:.mod vs .o

时间:2017-03-21 12:37:45

标签: makefile fortran gfortran fortran90

我有一个名为main_KMC.f90的主程序和一个名为modules的目录。在目录中,我有我的主程序所需的模块。 这里有main_KMC.f90。

program main_KMC
use geometry
use search_arguments
use mtfort90
implicit none

integer(8):: d,L,Nitt,warmSteps,measureSteps
integer(8) :: NS,i,nn,itt
integer(8),dimension(:,:),allocatable :: geom
integer(8),dimension(:),allocatable :: S!Vector de spins

T = get_db_arg(1,2.0d0)
d = get_int_arg(2,int(2,8))
L = get_int_arg(3,int(20,8))
Nitt = get_int_arg(4,int(1d6,8))
warmSteps = get_int_arg(5,int(1d3,8))
measureSteps = get_int_arg(6,int(1,8))
....


contains

end program

我尝试用make文件编译它:

MAIN = main
#MODULES = geometry mtfort search_arguments
MODULES = $(wildcard ./modules/*.f90)
MODULES_OBJ = $(patsubst ./modules/%.f90,%.o,$(MODULES))
MODULES_MOD = $(patsubst ./modules/%.f90,%.mod,$(MODULES))
F90 = gfortran


main.out : $(MODULE_OBJ) $(MAIN).o
    $(F90) -o main.out $(MAIN).o $(MODULE_OBJ)


$(MODULES_OBJ) : $(MODULES)
    $(F90) -c $^

$(MAIN).o: $(MODULE_OBJ) $(MAIN)_KMC.f90
    $(F90) -c $(MAIN)_KMC.f90 -o $(MAIN).o

.PHONY: all
all:
    @echo $(MODULES)
    @echo $(MODULES_OBJ)

.PHONY: clean
clean:
    @rm *.o
    @rm *.mod

.PHONY: modules
modules:$(MODULES_OBJ)

我的问题是: 1).mod和.out之间的区别是什么。因为我在make命令之前尝试过

$(MODULES_OBJ) : $(MODULES)
    $(F90) -c $^ -o $(MODULES_OBJ)

当我执行Makefile时,出现以下错误:

use geometry 
     1 
 Fatal Error: Can't open module file 'geometry.mod' for reading at (1): No such file or directory
 make: *** [main.o] Error 1

我认为使用目标文件,你应该编译程序。

我遇到的第二个问题是第一个Makefile。当我运行它时,会出现以下错误:

compilando main.out
gfortran -o main.out main.o 
main.o: In function `MAIN__':
main_KMC.f90:(.text+0x35): undefined reference to `__search_arguments_MOD_get_db_arg'
main_KMC.f90:(.text+0x57): undefined reference to `__search_arguments_MOD_get_int_arg'
main_KMC.f90:(.text+0x6a): undefined reference to `__search_arguments_MOD_get_int_arg'
main_KMC.f90:(.text+0x80): undefined reference to `__search_arguments_MOD_get_int_arg'
main_KMC.f90:(.text+0x93): undefined reference to `__search_arguments_MOD_get_int_arg'
main_KMC.f90:(.text+0xa6): undefined reference to `__search_arguments_MOD_get_int_arg'
main_KMC.f90:(.text+0x48a): undefined reference to `__geometry_MOD_geometry_compute'
main_KMC.f90:(.text+0x55b): undefined reference to `__mtfort90_MOD_grnd'
collect2: error: ld returned 1 exit status
make: *** [main.out] Error 1

0 个答案:

没有答案