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

How to compile Fortran FUNCTION/SUBROUTINE in separate files into a single MODULE

通常,当我编写一组 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

并且我这样编译成功了gfortran -c mystuff.f90。这将创建 mystuff.o,我可以在我的主程序中使用它。

然而,我的 MODULE 中 functions/subroutines 的数量和个体大小已经变得如此庞大,我真的需要将其拆分成不同的文件。

!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE

! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE

等等...

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

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

!mystuff.f90
MODULE mymodule
IMPLICIT NONE

CONTAINS

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

  !lots more functions and subroutines

END MODULE

来自here

The INCLUDE statement directs the compiler to stop reading statements from the current file and read statements in an included file or text

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


实现相同目的的替代方法是使用预处理器指令,如果您的编译器支持的话:

#include "filename"

为了可读性,最好将大模块分成更易于管理的块。每个较小的模块都可以单独编译,并在另一个 "master" 模块中使用,然后在主程序中使用。这种方法的主要好处是您可以拥有各种非常通用的模块,并且只选择目前有用的 procedures/data 。例如:

module mod_1
    implicit none
    subroutine proc_1
        ! ...
    end subroutine
    ! other procedures, etc.
end module mod_1

依此类推,针对您的每个独立模块。然后将它们收集在一个模块中。

module collection
    use mod_1, only: proc_1  ! pick & choose what to use
    use mod_2
    use mod_3
    ! ...
end module collection

program main
    use collection
    implicit none
    ! ...
end program main

编译主程序时,您可以 link 每个必要的目标文件,甚至可以将它们组合成一个 archive/library 并 link 到那个。