Chr*_*ite 5 linker fortran module 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
Run Code Online (Sandbox Code Playgroud)
当我尝试对此进行编译时,我遇到了麻烦:
[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
Run Code Online (Sandbox Code Playgroud)
另一方面,仅编译(gfortran -c -ffree-form test.f -Wall)运行不会产生任何抱怨。
现在,这看起来像是一个编译器错误,在全世界范围内-在模块中提供了mult_它真正应该解决的时间的参考__m1_MOD_sq--但我很难相信这是一个编译器错误,比我做蠢事
DDG没有提供任何有用的信息。将模块从一个主文件中分离出来时,大多数类似的问题都发生了。在这些情况下,当模块与处于同一文件中时,事情就可以解决了program,在这里不是这种情况。我查看了Fortran模块中的许多页面,但没有发现任何相关内容。
谁能指出我适当的文档,或者更好的解释发生了什么以及如何解决?
您不需要在函数 sq 中声明函数 mult,即不需要“real :: mult”。sq 已经“知道”了 mult,因为它在同一个模块中。mult 的接口对于 sq 是已知的,因为它们在同一个模块中。mult 和 sq 的接口对主程序来说是已知的,因为它使用模块。同时提供接口和声明的模块会使编译器感到困惑。