从模块中只加载一个子程序

Loading only one subroutine from module

我有一个模块,我在其中编写了一堆我经常使用的子例程。但是,并非每次我都需要它们。是否可以从该模块仅加载一个(或两个...)子程序?

我这样做的兴趣在于有一个特定的子例程需要另一个模块才能工作,所以如果我不打算使用该子例程,我宁愿避免加载那个额外的模块。

这是我的例子

MODULE MYLIBRARY
IMPLICIT NONE
CONTAINS

  SUBROUTINE PROC1
    PRINT *, 'This is PROC1'
  END SUBROUTINE PROC1

  SUBROUTINE PROC2
    USE EXTRAMOD
    PRINT *, 'This is PROC2'
  END SUBROUTINE PROC2

END MODULE MYLIBRARY

我希望能够只在我的主程序 PROC1 中加载,这样我就不必加载模块 EXTRAMOD(实际上我什至不需要那个文件)。在我的主程序中,我尝试使用 ONLY 选项,但这似乎只适用于变量而不适用于子例程。这是主文件的示例

PROGRAM MAIN    
  USE MYLIBRARY, ONLY : PROC1
  IMPLICIT NONE
  CALL PROC1  
END PROGRAM Main

编译时,出现错误 "Error in opening the compiled module file. Check INCLUDE paths. [EXTRAMOD]"。

有什么想法吗?

你想做的事情用那个编译器是不可能的,除非你改变 MYLIBRARY module 的来源,这样它就不再引用 EXTRAMOD.

(ONLY 说明符确实可以限制在给定范围内可访问的 module 的标识符,包括过程的标识符,但这与您的基本问题无关。)

请注意,对于给定源,您看到的行为是特定于编译器的。

使用该编译器,信息存储在 mod 文件中(这是一个编译器特定文件,用于将信息从 module 传递到 module 所在的位置used) 编译 module 的结果通常仅限于在该 module 中立即声明的内容。这意味着在 module 引用另一个 module 的情况下,当原始 mod使用了ule。

其他编译器可能使每个 mod 文件完整 - 存储在 mod 规则中立即声明的内容和从其他 mod 规则引用的任何内容。这减少了需要分发的文件数量,但会产生更大的 mod 个文件。

如果两个子程序完全独立,那么可以将MYLIBRARY module的源码一分为二,只使用包含mod你需要的规则。

如果 EXTRAMOD 中的实体不是 PROC2 的特征的一部分(例如,如果您使用 EXTRAMOD 中定义的类型作为 [=16] 的参数类型=],那么 EXTRAMOD 中的实体将用作特征的一部分),那么您可以将 PROC2 的定义移动到子 mod 规则中。这也将打破 MYLIBRARY 的 mod 文件对 EXTRAMOD.

的 mod 文件的依赖性