2012-07-16 51 views
3

我想在一个模块中编写一些函数/子程序,调用同一模块中的另一个函数并运行到链接器错误。玩具例子显示相同的行为:链接fortran模块:“未定义的参考”

!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 

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

[[email protected] 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模块中的许多页面,但没有看到任何相关的内容。

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

回答

2

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

+0

啊!是的,这工作。 (我觉得有点愚蠢。)谢谢! – 2012-07-16 22:19:48

+0

编译器本身并没有混淆 - 示例代码的含义已经很好定义:函数sq中的mult声明隐藏了主机中相同名称的实体。如果程序员想要访问多模块程序,他们“不得”分别声明函数。 F2008标准的相关部分是16.5.1.4p2。 – IanH 2012-07-16 22:22:50

+1

没有理由感到愚蠢。错误消息当然不容易连接到原因。 – 2012-07-17 05:00:20