Flavian Coelhoの作品を複製しようとしています。linked here CythonとGnu Scientific Library(GSL)を使用して、Pythonに比べて乱数を生成する速度が大幅に向上しました。私は(コマンドimport cgibbs
付き)Pythonで私のコンパイルCythonコードをインポートすると、私は次のエラーを取得する:外部CライブラリをリンクするときにCythonからImportErrorをインポートする
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ビット版)、gcc-4.0(GSLライブラリを32ビット形式でコンパイルしたもの)、GSL 1.15、Cython v0.15.1を実行するMac OSX 10.7(Lion)です。ここで
は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
の最後の行をコメントアウトする場合は、エラーが消えるが、その後、私は実際に外部ライブラリを使用することはできません...どれあなたが提供できる洞察は高く評価されます。ありがとう!
私はSWIGからは分かりません。 – Wesley