Sto tentando di replicare il lavoro di Flavian Coelho, linked here. Ha usato Cython e la Gnu Scientific Library (GSL) per ottenere un'enorme velocità su Python nella generazione di numeri casuali. Quando importo il mio codice Cython compilato in Python (con il comando import cgibbs
), ottengo il seguente errore:ImportError da Cython quando si collega una libreria C esterna
ImportError: dlopen(./cgibbs.so, 2): Symbol not found: _gsl_rng_mt19937
Referenced from: /Users/wesley/scratch/cython/cgibbs.so
Expected in: dynamic lookup
Si noterà che la denuncia è che il simbolo _gsl_rng_mt19937
non può essere trovato. La funzione a cui sto tentando di collegarmi è chiamata gsl_rng_mt19937
(nessun trattino basso principale), ed è così che appare nel mio file .pyx
. Penso che Cython sia in qualche modo causa del problema aggiungendo quel carattere di sottolineatura principale.
Per semplificare la risoluzione dei problemi, ho rimosso il codice e l'ho postato in basso. Il mio sistema è: Mac OSX 10.7 (Lion) con Python 2.7.2 (32-bit), gcc-4.0 (che ho usato per compilare le librerie GSL in formato 32-bit), GSL 1.15 e Cython v0.15.1.
Ecco il contenuto di 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)
L'errore va via se io commento l'ultima riga del mio cgibbs.pyx
, ma poi non può effettivamente utilizzare la libreria esterna ... Qualsiasi l'intuizione che puoi offrire è apprezzata. Grazie!
Non so da SWIG - forse dovrei, però. – Wesley