【问题标题】:Compiling an old fortran code in gfortran of ubuntu 18.04 [duplicate]在ubuntu 18.04的gfortran中编译旧的fortran代码[重复]
【发布时间】:2019-01-12 17:07:30
【问题描述】:

我是 fortran 新手,我想编译一段 1988 年编写的代码,http://www.seg.ethz.ch/software/velest.html。 我使用了这个命令:

f77 -o velest velest.f

并显示此错误

velest.f:10165:45:

      write(ifil,'(''North  rotate= '',f6.1,)') rotate
                                         1
Error: Unexpected element ‘)’ in format string at (1)
velest.f:4384:25:

   call RAYPATH(1,1,1,1.,1.,1.,1.,nl,thk,h,v,vsq,
                     1
Warning: Rank mismatch in argument ‘x’ at (1) (rank-1 and scalar) [-Wargument-mismatch]

然后我在代码中找到了第一个错误的位置,并删除了“f6.1”的“,”。这次再次编译后,出现了这些错误:

velest.f:4384:25:

   call RAYPATH(1,1,1,1.,1.,1.,1.,nl,thk,h,v,vsq,
                     1
Warning: Rank mismatch in argument ‘x’ at (1) (rank-1 and scalar) `[-Wargument-mismatch]`
/tmp/ccQk4MAf.o: In function `datetime_':
velest.f:(.text+0x310c): undefined reference to `time_'
velest.f:(.text+0x3120): undefined reference to `ctime_'
velest.f:(.text+0x3149): undefined reference to `sprintf_'
/tmp/ccQk4MAf.o: In function `cputimer_':
velest.f:(.text+0x3abf): undefined reference to `clock_'
collect2: error: ld returned 1 exit status

为了解决我按照本网站的指示http://nota.tw/2011/04/21/adjust-velest-in-ubuntu/ 但是这次编译后出现了这个错误:

velest.f:4384:25:

   call RAYPATH(1,1,1,1.,1.,1.,1.,nl,thk,h,v,vsq,
                     1
Warning: Rank mismatch in argument ‘x’ at (1) (rank-1 and scalar) [-Wargument-mismatch]
/tmp/cc7WrZmF.o: In function `datetime_':
velest.f:(.text+0x3119): undefined reference to `ctime_'
collect2: error: ld returned 1 exit status

如果有人能回答我的问题,我将不胜感激。

【问题讨论】:

  • 你提到了gfortran,但使用的是fort77,后者在我看来是一个从Fortran到C的转换脚本,然后运行gcc。使用时会发生什么:gfortran -o velest velest.f
  • 欢迎您,您不能只显示错误消息,我们还需要查看代码的相关部分(minimal reproducible example)。对于最后的错误,您必须向我们展示调用 CTIME 的代码部分。它不是标准的 Fortran 过程,并且在不同的编译器之间不兼容。 Gfortran 使用这个定义gcc.gnu.org/onlinedocs/gfortran/CTIME.html
  • 代码的外部链接不够。我们需要您的调整后查看您的代码!很可能只是忘记更改使用 CTIME 的行。
  • 在这一行“RAYPATH(1,1,1, 1.,1.,1.,1., ...)”中,1.0... 的虚拟(正式)参数是四个数组(x,y,z,vel),我认为 gfortran 正在抱怨。为了让它工作,我想我们需要更多地修改代码(比如使用临时数组 x、y、z、vel)。

标签: fortran gfortran fortran77


【解决方案1】:

格式字符串无效。 f6.1,) 中出现逗号。因此,gfortran 期待另一个编辑描述符而不是右括号。如果删除那个错误的逗号,代码就会编译。请注意,这可能是 gfortran 中的一个错误,因此您可能希望与 gfortran 开发人员进行交互。

【讨论】:

  • 请注意这是众所周知的,所需的更改在链接nota.tw/2011/04/21/adjust-velest-in-ubuntu 中进行了说明。 OP 确实应用了这些更改,并且他在第二版代码中不再有这个问题。他遇到的最后一个问题在其他地方,很可能只是由于错误或不完整地应用了链接中建议的更改。
  • 该注释中没有提到格式无效的问题,因此似乎不是那么为人所知。鉴于链接时缺少 ctime_ 的消息,这清楚地表明源代码具有 EXTERNAL 语句,这意味着不会使用 gfortran 的 CTIME。删除EXTERNAL语句。
  • external ctime 确实是可能的,OP 应该向我们展示他/她的更新代码,但将是重复的 stackoverflow.com/questions/35003926/… 我基本上在等待代码将其作为重复项关闭。你是对的,后面的逗号不在链接中,但很快就被 OP 识别并修复了,我认为这只是一种噪音或干扰。
  • 我检查了源代码。它包含exernal ctime。几乎所有从 libgfortran 导出的符号都有一个 _gfortran_ 前缀。 external ctime 告诉 gfortran 用户将提供例程。如果缺少该语句,则 gfortran 将链接到 _gfortran_ctime。
  • 当然会,它在重复链接中...但是您只检查了原始链接,您无法检查OP正在编译的代码,因为(s)他没有分享它。无论如何,我会关闭它,如果需要,它可以重新打开。
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 2023-04-06
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多