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

时间:2012-07-16 21:32:48

标签: module linker fortran 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

当我尝试编译时,我遇到了麻烦:

[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

另一方面,仅编译(gfortran -c -ffree-form test.f -Wall)没有投诉。

现在这就像编译器错误一样寻找全世界---在模块中它提出了mult_的引用,当它真的应该与__m1_MOD_sq结合时---但是我我很难相信这是一个编译器错误,而不是我做一些愚蠢的事情。

DDG没有发现任何有用的东西。将模块从一个主文件中分离出来时,大多数类似的问题都出现了。在这些情况下,当模块与program位于同一文件中时,情况有效,这不是这里的情况。我查看了Fortran中模块的许多页面,但没有看到任何相关内容。

任何人都可以向我指出适当的文档,或者更好的是,解释发生了什么以及如何解决它?

1 个答案:

答案 0 :(得分:3)

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