模块和遗留 Fortran 77 代码

Modules and legacy Fortran 77 codes

我有一组 blas/lapack 从 NETLIB 网站获得的函数。我想将这些函数放在 Fortran 模块中。我的其余代码在 Fortran 90 中。所以我开始这样做:

module modname
contains


double precision function ddot(n,dx,incx,dy,incy)
.
.
.
end function 


subroutine dpofa(a,lda,n,info) 
.
.
        double precision ddot
.
end subroutine dopfa
end module

当我编译时使用

gfortran modname.f90

我收到以下错误:

/tmp/ccC2EUFj.o: In function __temp_MOD_dpofa': temp.f90:(.text+0x11c): undefined reference toddot_'

我忽略了关于 Undefined reference to main 的错误,我意识到这是因为我在文件中没有程序 .. 结束程序语句。

但是,如果我删除带有 module modnamecontainsend module 的行,编译器编译时不会出现任何问题。

可能是什么问题?

在您的非模块方法中,您有很多外部函数和子例程。也就是说,如果这些是在模块外定义的,那么一个过程就不知道另一个过程。您通过使用声明语句 double precision ddot 将函数 ddot 告诉子例程 dpofa。编译器将该名称改写为 ddot_(有关详细信息,请参阅其他地方),并将您必须具有的真实函数的名称改写为相同的名称。链接器在需要时将一个符号解析为另一个符号。

当你开始使用一个模块时,你仍然有这个外部函数声明,但现在你拥有的真正的函数,在同一个模块中,不再是外部的。相反,有一个模块过程被破坏成 __temp_MOD_ddot 之类的东西。您不再使用损坏的名称 ddot_ 创建函数。

您可能在 dpofa 中引用了函数 ddot,但在模块版本中将指向未定义的符号 ddot_

您需要删除那些现在定义在同一模块中且不再是外部函数的函数声明。