ImportError из Cython при компоновке внешней библиотеки C

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

6
задан Wesley 15 February 2012 в 23:28
поделиться