ここにリンクされている、Flavian Coelho の作品を複製しようとしています。彼は Cython と Gnu Scientific Library (GSL) を使用して、乱数の生成を Python より大幅に高速化しました。コンパイルした Cython コードを Python で (コマンドを使用して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 (GSL ライブラリを 32 ビット形式でコンパイルするために使用)、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
実際には外部ライブラリを使用できません...あなたが提供できる洞察は大歓迎です。ありがとう!