我正在尝试在一个模块中编写一些函数/子例程,这些函数/子例程调用同一模块中的另一个函数并遇到链接器错误。显示相同行为的玩具示例:
!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 模块的页面,但没有看到任何相关内容。
任何人都可以向我指出适当的文档,或者更好的是,解释发生了什么以及如何解决它?