【问题标题】:Modules and legacy Fortran 77 codes模块和旧版 Fortran 77 代码
【发布时间】:2015-09-20 12:40:08
【问题描述】:

我有一组从 NETLIB 网站获得的 blas/lapack 函数。我想将这些函数放在 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:在函数__temp_MOD_dpofa': temp.f90:(.text+0x11c): undefined reference toddot_'

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

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

可能是什么问题?

【问题讨论】:

  • 您需要告诉 gfortran 链接到数学库,例如:-llapack -lblas
  • 我在模块中有源代码本身。我不明白为什么我需要链接 lapack/blas

标签: compiler-errors fortran fortran90 gfortran


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多