我用Fortran编写了这个模块:
MODULE utils
IMPLICIT NONE
PUBLIC
INTEGER :: num_atom ! number of atoms in one configuration
CONTAINS
SUBROUTINE readin
IMPLICIT NONE
INTEGER :: iargc, ndim, i
END SUBROUTINE readin
SUBROUTINE convert
IMPLICIT NONE
REAL :: x,y,z
END SUBROUTINE convert
我通过以下方式编制:
^{pr2}$因此,在尝试从以下python代码调用函数“readin”时:
import os
_path = os.path.dirname(os.path.realpath(__file__)) + "/" + "somelib.so"
from ctypes import cdll, byref, c_int, c_double, c_char
lib_polint = cdll.LoadLibrary(_path)
def A():
a = lib_polint.readin_
A()
我无法识别函数名到“有点不对劲”并出现以下错误:
“未定义符号:读取”。在
如果我移除模块并只保留子例程“readin”,它就可以工作了。 怎么处理?在
从共享库转储符号
看起来你的子程序在一个模块中影响了符号名。不是
readin_
,而是__utils_MOD_readin
。如果你把模块的名字放在最上面,那么你就把它放在最上面。在作为记录,我只是报告我在我的系统上看到的。我不熟悉fortran,不知道是否可以跨编译器使用这种命名。在
使用Fortran与C的互操作性,将链接器符号设置为任何您想要的符号
现在子例程作为一个外部可见的C函数的名称将只是
readin
,您不必担心名称的损坏。在如果没有模块,您可以打赌名称是},但不是经常这样。在
_readin
,但也可以是readin_
或{对于模块来说,这是一种抽奖,不同编译器的名称不同。使用这些符号是没有意义的。在
相关问题 更多 >
编程相关推荐