使用 Fortran 90 代码编译 Fortran 77 子例程

Compling Fortran 77 subroutines with Fortran 90 code

我在将用 f77 编写的 LAPack 子例程安装到 f90 程序时遇到问题。 Gfortran 是编译器。

我知道 f77 应该是 f90 的子集,但是例如 * 不能被编译器识别为注释的开头。它可以识别大部分代码,但会给出大量错误列表。

我的第一个想法是单独编译程序单元,但我对 f77 模块一无所知,如果它们存在的话。

你会怎么做?

解决方案是将 LAPACK 子例程和依赖项(由主例程调用的子例程、由主例程调用的子例程等)包含在单个 .f 文件中。此文件不是任何类型的模块或程序单元,它只是一个文本文件,其中包含所有子例程,没有特定顺序,一个接一个。

必须小心,因为 LAPACK 经常会遗漏 .tgz 文件中本应包含它们的依赖项。有一个讨论每个子例程的网络,可以在此处找到依赖关系图:http://www.netlib.org/lapack/explore-html/。检查是否存在所有被调用的子程序,如果存在,则将它们全部放在一个文件中,以简化编译命令。此外,更改主代码,以便在主程序中声明和考虑所有参数。每个子程序的参数在上面的网络中都有描述,因此很容易识别。

如果使用 gfortran,将 .f 文件编译为 .o 目标文件。这充当一种包含所有必要子例程的 f77 模块。它是通过以下命令完成的:

gfortran -c filename.f

-c表示将文件编译为目标文件。重要的是,所有用 FORTRAN 77 编写的子程序都在一个文件中,该文件与用 f90 编写的所有内容分开。

不需要任何 "use" 语句,因为没有使用实际的 FORTRAN 模块。必要时调用必要的子程序,不用担心这个。

编译命令将目标文件视为链接库:

gfortran filename.o progname.f90

这个解释非常精炼,你们中的大多数人肯定已经知道了,但这是一个新手问题,由于文献中没有明确解释的事情,花了很多时间研究。供自己以后参考,希望对其他初学者也有帮助。