架构x86_64:gfortran的未定义符号
大家好,我正在尝试编译一个由别人编写的Fortran代码,我相信是F77(.for extension)。我得到的错误是:架构x86_64:gfortran的未定义符号,fortran,gfortran,Fortran,Gfortran,大家好,我正在尝试编译一个由别人编写的Fortran代码,我相信是F77(.for extension)。我得到的错误是: Undefined symbols for architecture x86_64: "_random_", referenced from: _pms_ in ccx1qzWD.o ld: symbol(s) not found for architecture x86_64 collect2: error: ld returned 1 exit stat
Undefined symbols for architecture x86_64:
"_random_", referenced from:
_pms_ in ccx1qzWD.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我现在不发布代码,但我一直在网上搜索这个错误的含义,这样我就可以开始搜索解决方案,但找不到任何有用的信息。我以前没有Fortran的经验!非常感谢您对此错误含义的任何帮助。我使用的是mac,唯一包含“随机”的部分是子程序的一部分:
DOUBLE PRECISION RANDOM
DO 1 J=1,M
w(J)=dw+REAL(J*2-1)*dw/2.0
W1=w(J)*w(J)*w(J)*w(J)*w(J)
Vel1=Vel*Vel*Vel*Vel*W1/w(J)
Vel1=-6844.0697/Vel1
Gw(J)=0.77898/W1*EXP(Vel1)
Phi(J)=RANDOM()*8.0*ATAN(1.0)
1 CONTINUE
我正在使用:gfortran seisam.FOR进行编译
提前感谢您的建议 好的,看起来您肯定没有向链接器提供包含
random
实现的库。你可以四处挖掘,找到这样一个库,修改你的链接,看看结果如何。但是,将对random
的调用替换为对gfortran
内在rand
的调用会更容易,它将从0
和1
之间的均匀分布返回一个数字。这就是我建议你做的。有关更多详细信息,请参阅文档
更好的方法是使用现在标准的随机数
,但这是一个子程序,需要对程序进行更多修改
我一直怀疑,如果您构建程序的唯一步骤是在命令行上执行gfortran seisam.FOR
,那么您可能缺少到其他必要库的链接,因此如果您报告失败,我不会感到惊讶
这条线
DOUBLE PRECISION RANDOM
声明
RANDOM
是一种双精度的东西。稍后使用RANDOM()
可以清楚地看出,它是一个返回值的函数,而不是一个保存值的变量。编译器对实现例程的代码的位置漠不关心,但链接器却不关心。好的,我添加了源代码中一定是导致错误的部分(random不在其他任何地方)。我对一行有点困惑,它说:双精度随机这行是不是试图调用一个名为random的旧库?我不明白这句话的语法,也不明白它到底是什么意思(我疯狂地在谷歌上搜索,但找不到任何有用的东西)