我想在一个模块中编写一些函数/子程序,调用同一模块中的另一个函数并运行到链接器错误。玩具例子显示相同的行为:链接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模块中的许多页面,但没有看到任何相关的内容。
任何人都可以指给我适当的文档,或者更好的解释发生了什么以及我如何解决它?
啊!是的,这工作。 (我觉得有点愚蠢。)谢谢! – 2012-07-16 22:19:48
编译器本身并没有混淆 - 示例代码的含义已经很好定义:函数sq中的mult声明隐藏了主机中相同名称的实体。如果程序员想要访问多模块程序,他们“不得”分别声明函数。 F2008标准的相关部分是16.5.1.4p2。 – IanH 2012-07-16 22:22:50
没有理由感到愚蠢。错误消息当然不容易连接到原因。 – 2012-07-17 05:00:20