我正在尝试复制 Flavian Coelho 的作品,链接在这里。他使用 Cython 和 Gnu Scientific Library (GSL) 在生成随机数方面比 Python 获得了巨大的加速。当我在 Python 中导入已编译的 Cython 代码时(使用 command import cgibbs
),我收到以下错误:
ImportError: dlopen(./cgibbs.so, 2): Symbol not found: _gsl_rng_mt19937
Referenced from: /Users/wesley/scratch/cython/cgibbs.so
Expected in: dynamic lookup
您会注意到投诉是_gsl_rng_mt19937
找不到该符号。我试图链接的函数被调用gsl_rng_mt19937
(没有前导下划线),这就是它在我的.pyx
文件中的显示方式。我认为 Cython 通过添加前导下划线以某种方式引起了问题。
为了使故障排除更容易,我已经剥离了代码并将其发布在下面。我的系统是:运行 Python 2.7.2(32 位)的 Mac OSX 10.7(Lion)、gcc-4.0(我用来编译 32 位形式的 GSL 库)、GSL 1.15 和 Cython v0.15.1。
这是 cgibbs.pyx 的内容:
#declaring external GSL functions to be used
cdef extern from "math.h":
double sqrt(double)
cdef double Sqrt(double n):
return sqrt(n)
cdef extern from "gsl/gsl_rng.h":
ctypedef struct gsl_rng_type:
pass
ctypedef struct gsl_rng:
pass
gsl_rng_type *gsl_rng_mt19937
gsl_rng *gsl_rng_alloc(gsl_rng_type * T)
cdef extern from "gsl/gsl_randist.h":
double gamma "gsl_ran_gamma"(gsl_rng * r,double,double)
double gaussian "gsl_ran_gaussian"(gsl_rng * r,double)
cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)
如果我注释掉我的最后一行,错误就会消失cgibbs.pyx
,但是我实际上不能使用外部库......您可以提供的任何见解都将受到赞赏。谢谢!