'dlantr' (1) 不是函数

'dlantr' at (1) is not a function

我在尝试使用 Lapack 函数 dlantr 计算三角矩阵的范数时遇到了一个奇怪的问题。基本上,我有一个工作的单文件程序,里面有 dlantr 和一些其他 Lapack 程序,现在我想把它分成模块。 dlantr 在这样一个模块的子程序中结束。但是,尝试使用 gfortran-10 编译所述模块(通过 MPI 包装器编译器,因为那里也有一些 MPI),如

mpifort -o kde.o -c kde.f90

导致错误:

‘dlantr’ at (1) is not a function

这很奇怪,因为

subroutine foo(a)
    real(kind=DP), intent(in) :: a(2,2)
    real(kind=DP) :: tmp, dlantr
    print*, dlantr('F','L','N',2,2,a,2,tmp)**2
end subroutine

从主程序调用时也能正常工作。在出现问题的子程序中,声明方式同上,在原程序中,即 real(kind=DP) :: ..., dlantr, ...

可以找到有问题的代码here。是什么导致了这种行为,如何解决?

我原来的回答是错误的。这是一个编译器错误,可能 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87127。不过,这种显式使用 external 属性的解决方法可以使错误消失:

    real(kind=DP), external :: dlantr

此错误的 MWE 是:

subroutine sub
    integer :: d
    real :: f
    real :: a
    
    associate (c => d)
        a = f()
    end associate
end subroutine sub