如何将单独文件中的Fortran FUNCTION / SUBROUTINE编译为单个模块

Qua*_*Dot 2 fortran include gfortran

通常,当我编写一个Fortran函数集合时,我将它们放入MODULE这样的环境中:

!mystuff.f90
MODULE mymodule
IMPLICIT NONE

CONTAINS

  SUBROUTINE mysubroutine1(a,b)
  !code
  END SUBROUTINE

  SUBROUTINE mysubroutine2(a,b)
  !code
  END SUBROUTINE

  !lots more functions and subroutines

END MODULE
Run Code Online (Sandbox Code Playgroud)

这样我就成功地编译了它 gfortran -c mystuff.f90。这样mystuff.o就可以在主程序中使用它了。

但是,我中的函数/子例程的数量和大小MODULE已经变得非常庞大,以至于我真的需要将其分解为不同的文件。

!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)

! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)

等等...

但是我仍然希望将所有这些功能放在一个单一的 MODULE。如何告诉编译器在,,...中编译函数mysubrtn1.f90mysubrtn2.f90以便在.o文件中生成单个模块?

Ale*_*ogt 6

您可以简单地使用它include来包含另一个Fortran源代码文件:

!mystuff.f90
MODULE mymodule
IMPLICIT NONE

CONTAINS

  include 'mysubrtn1.f90'
  include 'mysubrtn2.f90'

  !lots more functions and subroutines

END MODULE
Run Code Online (Sandbox Code Playgroud)

这里

INCLUDE语句指示编译器停止从当前文件中读取语句,并从包含的文件或文本中读取语句

因此,您可以看到生成的模块仍将包含两个子例程。


如果您的编译器支持,则可以实现预处理的另一种方法是使用预处理器指令:

#include "filename"
Run Code Online (Sandbox Code Playgroud)