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

Compiling using gfortran on older code

我需要 运行 在这里找到一个旧程序: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

这个错误好像是代码中的语法错误?我怀疑代码本身有什么问题,所以我认为这与我对代码的系统解释有关(因为缺乏更好的措辞方式)

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

编辑

正如埃德·史密斯所建议的 我 运行 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

以下为我编译:

gfortran sclibdbl.f KIRCH1.f

其中 KIRCH1.f 是来自 http://netlib.sandia.gov/conformal/kirch1 and sclibdb1.f is the code from 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 标志来消除这两个常见的块错误。可以通过将第 258 行的 x(1) 替换为 x(n-1) 来消除 x(1) 错误。就个人而言,除非您在 运行 代码(尤其是来自 netlib)时注意到 problems/unexpected 行为,否则我不会担心。