嗨,所以我正在尝试编译由我认为是F77(.for扩展名)的其他人编写的Fortran代码。我得到的错误是:
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,唯一包含“random”的部分是子程序的一部分:
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 SEASIM.FOR编译
提前感谢任何建议!
答案 0 :(得分:1)
好的,看起来你肯定没有为链接器提供包含random
实现的库。你可以挖掘并找到这样一个库,修改你的链接,看看它是怎么回事。但是通过调用random
内在gfortran
来替换rand
的来电会更容易,后者会在0
和{{1}之间的统一分布中返回一个数字}。这就是我建议你做的。有关详细信息,请参阅文档。
更好的方法是使用现在标准的1
,但这是一个子程序,需要对程序进行更多修改。
我有一种唠叨的怀疑,如果你构建程序的唯一步骤是在命令行执行random_number
那么你可能会错过链接到其他必要的库,所以我不会感到惊讶,如果你报告失败。
这一行
gfortran SEASIM.FOR
声明DOUBLE PRECISION RANDOM
是RANDOM
件事。它是一个返回值而不是保存值的变量的函数,后来使用DOUBLE PRECISION
就清楚了。编译器对实现例程的代码的位置无动于衷,但链接器不是。