Я пытаюсь повторить работу Флавиана Коэльо, ссылка здесь .Он использовал Cython и Научную библиотеку Gnu (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 каким-то образом вызывает проблему, добавляя подчеркивание.
Чтобы упростить поиск неисправностей, я сократил код и разместил его ниже.Моя система: Mac OSX 10.7 (Lion) под управлением Python 2.7.2 (32-разрядная версия), 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
, но тогда я не смогу использовать внешнийбиблиотека ... Любое понимание, которое вы можете предложить, приветствуется.Спасибо!