Estoy tratando de replicar el trabajo de Flavian Coelho, linked here. Usó Cython y la Biblioteca Científica Gnu (GSL) para obtener una gran aceleración sobre Python en la generación de números aleatorios. Cuando importo mi código compilado Cython en Python (con el comando import cgibbs
), me sale el siguiente error:ImportError de Cython al vincular una biblioteca de C externa
ImportError: dlopen(./cgibbs.so, 2): Symbol not found: _gsl_rng_mt19937
Referenced from: /Users/wesley/scratch/cython/cgibbs.so
Expected in: dynamic lookup
Se dará cuenta de que la queja es que el símbolo _gsl_rng_mt19937
no se puede encontrar. La función a la que intento vincularme se llama gsl_rng_mt19937
(sin subrayado inicial), y así es como aparece en mi archivo .pyx
. Creo que Cython de alguna manera está causando el problema al agregar ese guion bajo.
Para facilitar la solución de problemas, he eliminado el código y lo he publicado a continuación. Mi sistema es: Mac OSX 10.7 (Lion) ejecutando Python 2.7.2 (32 bits), gcc-4.0 (que utilicé para compilar las bibliotecas GSL en formato de 32 bits), GSL 1.15 y Cython v0.15.1.
Aquí es el contenido del 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)
El error desaparece si comento hacia fuera la última línea de mi cgibbs.pyx
, pero en realidad no puedo utilizar la biblioteca externa ... Cualquier la visión que puede ofrecer es apreciada. ¡Gracias!
No sé de SWIG, aunque debería hacerlo. – Wesley