【问题标题】:Undefined reference to 'main' when compiling a module编译模块时对“main”的未定义引用
【发布时间】:2015-01-03 08:48:34
【问题描述】:

我正在学习 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 的误用,因此我们将不胜感激。

【问题讨论】:

    标签: compiler-errors fortran


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哇哦,是的!那行得通!我一直在尝试不同的事情,并使用 gfortran 命令将所有文件(主程序和模块)作为参数传递,它编译和工作也没有问题。谢谢!还有一个问题,你将如何编译一个使用 100 个模块的程序?在 CLI 中使用 gfortran 似乎并没有很好地升级。
    • 我假设您的意思是“100 个文件”。您使用某种构建自动化软件。
    猜你喜欢
    • 2012-08-16
    • 2015-08-25
    • 2020-08-28
    • 1970-01-01
    • 2014-06-07
    • 2017-05-08
    • 1970-01-01
    • 2015-02-25
    • 2023-03-10
    相关资源
    最近更新 更多