在旧代码上使用gfortran进行编译

时间:2015-04-04 16:45:23

标签: compilation fortran gfortran

我需要运行一个旧程序:http://netlib.sandia.gov/conformal/,标题为" kirch1"在列表中。我绝对没有运行fortran代码的经验,但我想从我的Mac OS X 10.10命令行中这样做。

我知道我有' gfortan'编译器安装在我的系统上,但我不确定这是不是喜欢这个旧代码。当我运行gfortran KIRCH1.f(此文件是上面的那个)时,我收到以下错误:

KIRCH1.f:266.8:

      x(2) = -1. + dx                                                   
        1
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1
KIRCH1.f:200.21:

      common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)       
                     1
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
KIRCH1.f:285.21:

      common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)             
                     1
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
Undefined symbols for architecture x86_64:
  "_gaussj_", referenced from:
      _qinitx_ in ccoKtvwZ.o
  "_ns01a_", referenced from:
      _ksolv_ in ccoKtvwZ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

这个错误似乎与代码中的语法有关?我怀疑代码本身有什么问题,所以我认为它与代码的系统解释有关(因为没有更好的方法来表达代码)

我没有富有的编程经验,我应该提一下。我做错了什么?

修改

正如Ed Smith所说 我运行gfortran sclibdbl.f KIRCH1.f但我仍然收到以下警告:

KIRCH1.f:266.8:

      x(2) = -1. + dx                                                   
        1
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1
KIRCH1.f:200.21:

      common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)       
                     1
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
KIRCH1.f:285.21:

      common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)             
                     1
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons

1 个答案:

答案 0 :(得分:2)

以下为我编译:

gfortran sclibdbl.f KIRCH1.f

其中KIRCH1.f是来自http://netlib.sandia.gov/conformal/kirch1的代码,而sclibdb1.f是来自http://netlib.org/conformal/sclibdbl的代码。

您刚刚错过了KIRCH1源代码中引用但包含在sclibdbl中的必需子例程gaussjns01a。 netlib.org/conformal/sclibdbl中的代码包括gaussjns01a子例程(请注意,默认情况下,gfortran会将下划线添加到例程名称中)。

正如@francescalus所说,它是现代的fortran编译器和旧式的FORTRAN代码。警告是因为现代fortran对数组范围更加明确。在此代码中,x以大小为1传递给yxtran(),这是正常的,因为传递是对数组开始的引用。当访问元素2时,现代fortran编译器会感到担忧。您可以通过向编译器添加-fno-align-commons标志来删除这两个常见的块错误。通过用x(n-1)替换线258上的x(1)可以消除x(1)误差。就个人而言,除非您在运行代码时发现问题/意外行为,否则我不会担心(特别是因为它来自netlib)。