如何在Fortran95中链接主程序和子程序?

时间:2014-12-14 12:36:57

标签: linker fortran object-files

如何将外部子程序链接到Fortran中的主程序? 虽然,我从书中得到了一个题为“科学家和工程师的Fortran 90”的答案 如下:

  

另请注意,由于外部子程序位于单独的子程序中   来自主程序的文件,必须单独编译。下   FTN90是一种中间类型的机器代码,称为可重定位二进制   在.OBJ扩展名的文件中生成。这反过来必须是   通过一个名为a的特殊程序与调用程序相关联   链接器,最终导致主程序的.EXE版本。您的   编译器手册将详细介绍如何执行此操作。一旦它   最后调试,外部子程序永远不需要重新编译,   只有联系。这可以防止您在编译时浪费时间   如果它是一个内部子程序就会出现这种情况。

无论如何,我没有找到任何关于如何链接主程序和子程序的手册。我使用Silverfrost(Plato)来调试和运行程序。此外,我在系统上安装了“Intel Parallel Studio XE 2011”。

1 个答案:

答案 0 :(得分:0)

暂时我假设外部子程序(功能或子程序)与主程序在同一目录中。在fortran77或更早的时候,你只需从主程序中调用子程序,并将它们与主程序和子程序中都存在的COMMON语句链接起来。但是,现在首选方法是将外部子程序写入模块并使用USE语句链接模块。例如,让我们编写一个虚构的子程序,读取的值是' x'并努力反馈“和”的价值观。和' z'到主程序。程序和模块可能如下所示。一个模块本质上是我试图变得有点面向对象,因为它确保数据被封装到程序中,并且除非程序员希望它是全局的,否则不能全局访问。重要的是程序员将子程序声明为PRIVATE,如果它只是由模块中的其他程序调用,而PUBLIC则由主程序调用。另外,为了确保正确使用数据,如果变量仅被送入例程,或者被称为tot,则应将其声明为INTENT(IN),INTENT(OUT)或INTENT(INOUT)他常规,工作并反馈到主程序。我希望这有帮助,如果没有随意提出任何其他问题。此外,当使用外部子程序编译主程序时,按子程序的顺序调用它们进行编程。这意味着不要使用ifort main.f90 module.f90,而是必须键入fort module.f90 main.f90,假设你使用的是intel编译器,如果没有,那么用你编译器使用的命令替换fort。

   PROGRAM MAIN
   USE Test
   IMPLICIT NONE
   REAL :: X,Y,Z
   X = 5.0
   WRITE(*,*) X,Y,Z
   END PROGRAM MAIN

   MODULE Test
   PUBLIC :: Subroutine_Example
   CONTAINS 

   SUBROUTINE Subroutine_Example(X,Y,Z)
   REAL, INTENT(IN) :: X
   REAL, INTENT(OUT :: Y,Z
   Y = X + 34.6
   Z = X - 1.4
   END Subroutine_Example
   END MODULE Test