在旧代码上使用 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 中的必需子例程 gaussj
和 ns01a
。来自 netlib.org/conformal/sclibdbl 的代码包括 gaussj
和 ns01a
子例程(请注意,在 gfortran 中默认情况下将下划线添加到例程名称中)。
正如@francescalus 指出的那样,它是现代的 Fortran 编译器和老式的 FORTRAN 代码。警告是因为现代 fortran 对数组范围的定义要明确得多。在此代码中,x 以大小 1 传递给 yxtran()
,这是可以的,因为传递的是对数组开头的引用。当访问元素 2 时,现代 Fortran 编译器会担心。您可以通过向编译器添加 -fno-align-commons
标志来消除这两个常见的块错误。可以通过将第 258 行的 x(1) 替换为 x(n-1) 来消除 x(1) 错误。就个人而言,除非您在 运行 代码(尤其是来自 netlib)时注意到 problems/unexpected 行为,否则我不会担心。
我需要 运行 在这里找到一个旧程序: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 中的必需子例程 gaussj
和 ns01a
。来自 netlib.org/conformal/sclibdbl 的代码包括 gaussj
和 ns01a
子例程(请注意,在 gfortran 中默认情况下将下划线添加到例程名称中)。
正如@francescalus 指出的那样,它是现代的 Fortran 编译器和老式的 FORTRAN 代码。警告是因为现代 fortran 对数组范围的定义要明确得多。在此代码中,x 以大小 1 传递给 yxtran()
,这是可以的,因为传递的是对数组开头的引用。当访问元素 2 时,现代 Fortran 编译器会担心。您可以通过向编译器添加 -fno-align-commons
标志来消除这两个常见的块错误。可以通过将第 258 行的 x(1) 替换为 x(n-1) 来消除 x(1) 错误。就个人而言,除非您在 运行 代码(尤其是来自 netlib)时注意到 problems/unexpected 行为,否则我不会担心。