【问题标题】:Linking fortran module: "undefined reference"链接 fortran 模块:“未定义的引用”
【发布时间】:2012-07-15 19:23:03
【问题描述】:

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

!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 模块的页面,但没有看到任何相关内容。

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

【问题讨论】:

    标签: module linker fortran gfortran


    【解决方案1】:

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

    【讨论】:

    • 啊!是的,那行得通。 (我觉得有点愚蠢。)谢谢!
    • 编译器本身并没有混淆 - 示例代码的含义已经很好地定义了:函数 sq 中的 mult 声明隐藏了主机中的同名实体。如果程序员想要访问多模块过程,他们“不得”单独声明该函数。 F2008标准的相关部分是16.5.1.4p2。
    • 没有理由感到愚蠢。错误消息肯定不是很容易连接到原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多