编译模块时对 'main' 的未定义引用

Undefined reference to 'main' when compiling a module

我正在学习 Fortran,但一直在尝试编译一个模块供以后使用。

在主程序中我有这个,它要求两个数字然后调用模块中的函数:

use exponentiate
integer::a,b
write *, 'A'
read *, 'a
write *, 'B'
read *, 'b
write *,expo(a,b)

(我还没有尝试过,因为我需要先编译模块,但这不是问题)

然后,在另一个文件中,我有这段代码,它(如果我理解正确的话)只是一个标准模块,带有一个函数,可以对两个数字求幂。

module exponentiate
interface test 
  module procedure expo
end interface
contains
  function expo(a,b)
    type(integer), intent(in)::a,b
    type(integer) expo
    integer::temp
    temp=a
    do i=1,b
      temp=temp*a
    end do
    expo=temp
  end function expo
end module exponentiate

我一直试图根据编译器错误找出语法,因为 Fortran 95 规范不可读且几乎无用。有了它和一些 Wikipedia/SO 帮助,我已经能够弄清楚一些事情,但我不知道为什么会弹出这个编译器错误。

我不确定这是因为某些语法问题还是 gfortran 的误用,因此我们将不胜感激。

如果没有相反的选项,编译器驱动程序(以及许多其他的,无论语言如何)将假定它们被赋予了完整程序或类似程序所需的所有组件 - 将源代码编译为目标代码(正确编译) , 将该目标代码与任何其他指定的目标代码或库链接并生成可执行文件。

在 Fortran 程序的上下文中,如果没有某种形式的主程序,则无法完成该过程。许多 Fortran 编译器对主程序的内部名称是 main 或类似名称(大小写和附加下划线存在变体)- 您只是看到编译器驱动程序无法使用主程序的后果。

使用该编译器驱动程序(和大多数其他驱动程序),要仅将 Fortran 源代码编译为目标代码(即 file.f90 -> file.o),请提供 -c 命令行选项。然后,当您准备好为您的程序构建最终的可执行文件时,您可以提供带有目标代码的结果文件,以便稍后调用编译器驱动程序。

或者,在命令行中模块的源文件名称后提供主程序的源文件名称(以及任何其他源文件的名称)。