Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module Fortran 95-如何在编译主程序时自动查找主程序中使用的模块_Module_Fortran_Build Process - Fatal编程技术网

Module Fortran 95-如何在编译主程序时自动查找主程序中使用的模块

Module Fortran 95-如何在编译主程序时自动查找主程序中使用的模块,module,fortran,build-process,Module,Fortran,Build Process,我制作了我的第一个Fortran程序mainp.f95,其中包含两个单独的文件mfun.f95和mbiesection.f95,它们是mainp.f95中使用的模块 我在互联网上找到了两种编译方法: 第一条路 然后创建a.out和两个files.mod,作为可执行文件的a.out 第二条路 然后创建两个文件.o和两个文件.mod gfortran mainp.f95 mbisection.o mfun.o 然后创建a.out文件 我不知道他们是否是optima,但他们成功了 问题: 但是,假设

我制作了我的第一个Fortran程序mainp.f95,其中包含两个单独的文件mfun.f95和mbiesection.f95,它们是mainp.f95中使用的模块

我在互联网上找到了两种编译方法:

第一条路

然后创建a.out和两个files.mod,作为可执行文件的a.out

第二条路

然后创建两个文件.o和两个文件.mod

gfortran mainp.f95 mbisection.o mfun.o
然后创建a.out文件

我不知道他们是否是optima,但他们成功了

问题:

但是,假设我没有2个模块,而是20个模块

我应该在gfortran命令中编写每个模块,还是有办法“只编译主程序”,自动添加所需的.o和.mod文件?(假设所有文件都在同一文件夹中,因此很容易“搜索模块”)


非常感谢

当一个项目从“Hello World”发展到更复杂的东西时,是时候从直接命令行编译切换到一个新的编译了。有许多方法可以简化大型项目的构建,例如

当一个项目从“Hello World”发展到更复杂的东西时,是时候从直接命令行编译切换到一个新的编译了。有许多方法可以简化大型项目的构建,例如

我已经查看了这些链接。然而,我注意到它们都是为C或Java设计的。通过搜索论坛,包括High Performance Mark编写的线程,我注意到“自动构建”并不是别的事情,而是将我将在终端中编写的所有命令都写入一个文件,然后运行该文件

我还以为是别的。。。自动(例如,它为您查找依赖的文件(如其他文件中的模块),并按“建议的顺序”进行编译,只需单击一次)

我认为这肯定存在于互联网上的某个地方,但由于我还没有找到它,我决定创建自己的自动编译器。既然你帮了我,我就和你分享我的编译器(你会发现它非常基本,没有编译选项,但对我来说高级选项(到目前为止)是不相关的,老实说,是未知的)

我的编译器是一个fortran编写的文件,其工作原理如下:

第一阶段: 它获取一个fortran.f95文件,然后读取其第二行。如果发现“使用”,则复制已使用的模块。此过程将重复,直到找到所有模块

第二阶段: 然后打开每个模块,以搜索子模块。这个过程是一样的:它读取第二行,如果它找到一个“use”,那么它复制子模块。然后第三个。。。直到它找不到“有用”字

第三阶段: 然后,它复制字符数组中的所有子模块(这里假设子模块不能使用模块,这是一个缺点,在包含PI、E等的模块中思考),并搜索所有相同的模块,以便只编译每个模块一次

第四阶段: 然后它写入要在终端中写入的最终命令:gfortran(list of submodules.f95)(list of modules.f95)main.f95

文件扩展名“.f95”是在文件开头初始化的单词,因此可以很容易地将其更改为“f90”或其他任何名称

我没有看到任何按钮来添加我的代码,所以我把它复制到这里,以防有人想使用它。它对我有用。 这些文件必须位于同一文件夹中。我希望回复我和发布我的编译器不会违反stackexchange的规则,我的意图是帮助而不是打扰:)


我已经看过了这些链接。然而,我注意到它们都是为C或Java设计的。通过搜索论坛,包括High Performance Mark编写的线程,我注意到“自动构建”并不是别的事情,而是将我将在终端中编写的所有命令都写入一个文件,然后运行该文件

我还以为是别的。。。自动(例如,它为您查找依赖的文件(如其他文件中的模块),并按“建议的顺序”进行编译,只需单击一次)

我认为这肯定存在于互联网上的某个地方,但由于我还没有找到它,我决定创建自己的自动编译器。既然你帮了我,我就和你分享我的编译器(你会发现它非常基本,没有编译选项,但对我来说高级选项(到目前为止)是不相关的,老实说,是未知的)

我的编译器是一个fortran编写的文件,其工作原理如下:

第一阶段: 它获取一个fortran.f95文件,然后读取其第二行。如果发现“使用”,则复制已使用的模块。此过程将重复,直到找到所有模块

第二阶段: 然后打开每个模块,以搜索子模块。这个过程是一样的:它读取第二行,如果它找到一个“use”,那么它复制子模块。然后第三个。。。直到它找不到“有用”字

第三阶段: 然后,它复制字符数组中的所有子模块(这里假设子模块不能使用模块,这是一个缺点,在包含PI、E等的模块中思考),并搜索所有相同的模块,以便只编译每个模块一次

第四阶段: 然后它写入要在终端中写入的最终命令:gfortran(list of submodules.f95)(list of modules.f95)main.f95

文件扩展名“.f95”是在文件开头初始化的单词,因此可以很容易地将其更改为“f90”或其他任何名称

我没有看到任何按钮来添加我的代码,所以我把它复制到这里,以防有人想使用它。它对我有用。 这些文件必须位于同一文件夹中。我希望回复我和发布我的编译器不会违反stackexchange的规则,我的意图是帮助而不是打扰:)


例如,这里甚至有Qs&As,它们在一定程度上回答了这个问题
gfortran -c mfun.95 -o mfun.o
gfortran -c mbisection.f95 -o mbisection.o
gfortran mainp.f95 mbisection.o mfun.o
program compilador

IMPLICIT NONE
CHARACTER (LEN=18),DIMENSION(100) :: matvec
INTEGER,DIMENSION(10) :: m,proh
CHARACTER (LEN=18) :: hayuse
CHARACTER (LEN=18),DIMENSION(10) :: modulos
CHARACTER (LEN=18),DIMENSION(10,10) :: submodulos
CHARACTER (LEN=4) :: ext='.f95'
CHARACTER (LEN=2) :: for
INTEGER :: n,j,i=1,t,total,error_de_apertura,error_de_lectura,error_de_escritura 
LOGICAL :: cond OPEN(60,FILE='main.f95',STATUS='OLD',ACTION='READ',& 
IOSTAT=error_de_apertura)
IF (error_de_apertura>0) STOP 'main.f95 NO ABIERTO'
OPEN (70,FILE='comando.txt',STATUS='NEW',ACTION='WRITE',& IOSTAT=error_de_apertura)
IF (error_de_apertura>0) STOP 'comando.txt NO ABIERTO'
DO
if (i==1) then
READ(60,'(/,A3,X1A)',IOSTAT=error_de_lectura) hayuse,modulos(i)
else
READ(60,'(A3,X1A)',IOSTAT=error_de_lectura) hayuse,modulos(i)
endif
if (.not.(hayuse=='use')) exit modulos(i)
(len_trim(modulos(i))+1:len_trim(modulos(i))+4)='.f95' WRITE(*,*) hayuse,modulos(i) 
i=i+1
end do

n=i-1
IF (n>=1) THEN

!MODULOS DE MODULOS DO i=1,n

OPEN(30+i,FILE=modulos(i),STATUS='OLD',ACTION='READ',& IOSTAT=error_de_apertura)
IF (error_de_apertura>0) then
WRITE(*,*) modulos(i)//' NO ABIERTO'
STOP
endif
j=1
DO
if (j==1) then
READ(30+i,'(/,A3,X1A)',IOSTAT=error_de_lectura) hayuse,submodulos(i,j)
else
READ(30+i,'(A3,X1A)',IOSTAT=error_de_lectura) hayuse,submodulos(i,j)
endif
if (error_de_lectura>0) then WRITE (*,*) 'Error de lectura en ',modulos(i)
endif
if (.not.(hayuse=='use')) exit
submodulos(i,j)(len_trim(submodulos(i,j))+1:len_trim(submodulos(i,j))+5)='.f95'
WRITE(*,*) hayuse,submodulos(i,j)
j=j+1
end do
m(i)=j-1
end do
endif


total=1
Do i=1,n
Do j=1,m(i)
matvec(total)=submodulos(i,j)
total=total+1
end do
end do
total=total-1

!BUSQUEDA
Do i=1,total
Do j=i+1,total
if (matvec(i)==matvec(j)) then
matvec(j)=' '
endif
end do
end do

WRITE(*,*) matvec

if (n>=1) then
WRITE(70,*,IOSTAT=error_de_escritura) 'gfortran ',matvec(1:total),modulos(1:n),' main.f95'
else
WRITE(70,*,IOSTAT=error_de_escritura) 'gfortran ','main.f95'
endif
if (error_de_escritura>0) STOP 'Error de escritura final'

END PROGRAM compilador