链接fortran模块:“未定义的引用”

Chr*_*ite 5 linker fortran module gfortran

我试图在模块中编写一些函数/子例程,以在同一模块中调用另一个函数并遇到链接器错误。一个显示相同行为的玩具示例:

!in test.f

module m1
  implicit none
contains
  real function mult(a, b)
    real :: a
    real :: b
    mult = a * b
    return
  end function mult

  real function sq(a)
    real :: a, mult
    sq = mult(a, a)
    return
  end function sq

end module m1

program main
use m1
write(*,*) sq(2.0)
end program
Run Code Online (Sandbox Code Playgroud)

当我尝试对此进行编译时,我遇到了麻烦:

[christopher@archlinux metropolis]$ gfortran -ffree-form test.f
/tmp/ccpzdTLE.o: In function `__m1_MOD_sq':
test.f:(.text+0x20): undefined reference to `mult_'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

另一方面,仅编译(gfortran -c -ffree-form test.f -Wall)运行不会产生任何抱怨。

现在,这看起来像是一个编译器错误,在全世界范围内-在模块中提供了mult_它真正应该解决的时间的参考__m1_MOD_sq--但我很难相信这是一个编译器错误,比我做蠢事

DDG没有提供任何有用的信息。将模块从一个主文件中分离出来时,大多数类似的问题都发生了。在这些情况下,当模块与处于同一文件中时,事情就可以解决了program,在这里不是这种情况。我查看了Fortran模块中的许多页面,但没有发现任何相关内容。

谁能指出我适当的文档,或者更好的解释发生了什么以及如何解决?

M. *_* B. 5

您不需要在函数 sq 中声明函数 mult,即不需要“real :: mult”。sq 已经“知道”了 mult,因为它在同一个模块中。mult 的接口对于 sq 是已知的,因为它们在同一个模块中。mult 和 sq 的接口对主程序来说是已知的,因为它使用模块。同时提供接口和声明的模块会使编译器感到困惑。

  • 没有理由感到愚蠢。错误消息肯定不容易与原因联系起来。 (2认同)