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

时间:2015-01-03 08:48:34

标签: compiler-errors fortran

我正在学习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规范不可读且几乎无用。有了这个和一些维基百科/ SO帮助我已经能够解决一些问题,但我不知道为什么会出现这个编译器错误。

我不确定这是因为某些语法问题还是滥用gfortran,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

使用该编译器驱动程序(以及大多数其他驱动程序),仅将Fortran源代码编译为目标代码(即file.f90 - > file.o),提供-c命令行选项。然后,当您准备为程序构建最终可执行文件时,可以将生成的文件与目标代码一起提供给稍后调用的编译器驱动程序。

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