, я пытаюсь воспроизвести работу Флавиана Коэльо , ссылка на которую приведена здесь . Он использовал 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
, но тогда я не смогу использовать внешнюю библиотеку. .. Любое понимание, которое вы можете предложить, приветствуется. Спасибо!