Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 链接fortran模块:“;“未定义引用”;_Module_Linker_Fortran_Gfortran - Fatal编程技术网

Module 链接fortran模块:“;“未定义引用”;

Module 链接fortran模块:“;“未定义引用”;,module,linker,fortran,gfortran,Module,Linker,Fortran,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

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

!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-formtest.f-Wall
)运行时没有任何抱怨

现在,这看起来就像是一个编译器错误——在模块中,当它真的应该与
\uuu m1\u MOD\u sq
配合时,它会引用
mult\ucode>——但我很难相信这是一个编译器错误,而不是我做了一些愚蠢的事情

DDG没有发现任何有用的东西。大多数类似的问题都发生在将模块从一个主文件中分离出来的过程中。在这些情况下,当模块与
程序位于同一个文件中时,情况就正常了,但这里的情况并非如此。我看了很多关于Fortran中模块的页面,没有看到任何相关内容


有人能给我指出合适的文档吗,或者更好的解释一下发生了什么以及我如何修复它吗?

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

Ah!是的,成功了。(我觉得有点傻。)谢谢你!编译器本身并没有混淆——示例代码的含义定义得很好:函数sq中mult的声明隐藏了主机中同名的实体。如果程序员想要访问多模块过程,他们“不得”单独声明函数。F2008标准的相关章节为16.5.1.4p2。没有理由感到愚蠢。错误消息显然不容易连接到原因。