Domanda

Sto cercando di replicare il lavoro di Flavio Coelho, collegato qui . Ha usato Cython e la Gnu Scientific Library (GSL) per ottenere un enorme velocità-up 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: 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 lamentela è che il _gsl_rng_mt19937 simbolo non può essere trovato. La funzione che sto cercando di link è chiamato gsl_rng_mt19937 (senza sottolineatura), ed è così che appare nel mio file .pyx. Credo che Cython è in qualche modo la causa del problema con l'aggiunta di quel leader di sottolineatura.

Al fine di rendere la risoluzione dei problemi più semplice, ho messo a nudo il codice verso il basso e postato qui sotto. Il mio sistema è: Mac OSX 10.7 (Lion) in esecuzione Python 2.7.2 (32-bit), gcc-4.0 (che ho usato per compilare le librerie GSL in forma a 32 bit), GSL 1.15, e Cython v0.15.1 <. / p>

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 ... Tutta la comprensione che si può offrire è apprezzato. Grazie!

È stato utile?

Soluzione

Grazie a @ChuiTey, ho scoperto che otool e nm sono gli strumenti su Mac che può fare quello che fa objdump su Linux. Con nm Ho trovato che le sottolineature importanti fanno parte del nome del simbolo nella libreria libgsl.a.

Una volta che ho saputo che il linker (nel mio caso, ld) stava cercando il nome giusto, era chiaro che semplicemente non stava guardando nel posto giusto. Ed è così che ho imparato che i file di intestazione non si conosce la posizione delle librerie a cui si collegano (Duh!) Ho solo bisogno di aggiungere l'opzione -lgsl al comando che gestisce il linker (questo richiede che libgsl.a si trova nella directory in cui il tuo aspetto linker per biblioteche -. sulla mia macchina, che è /usr/local/lib)

Ho anche dovuto spostare libgsl.dylib da /usr/local/lib perché è stato compilato per una piattaforma a 64-bit e sto usando 32 bit Python.

Ci deve essere un modo semplice per specificare l'opzione -lgsl linker quando si compila il codice Cython con distutils o un makefile; per ora mi sto solo facendo funzionare gcc-4.0 due volte per compilare e quindi collegare il modulo. Il mio flusso di lavoro di compilare un modulo Cython dalla riga di comando bash è:

cython cgibbs.pyx
gcc-4.0 -m32 -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c cgibbs.c -o cgibbs.o
gcc-4.0 -bundle -undefined dynamic_lookup -lgsl -arch i386 -g cgibbs.o -o cgibbs.so

che produce cgibbs.so, un modulo Cython che può essere importato in Python 2.7.

Altri suggerimenti

Anteporre una sottolineatura a funzioni esportate è conosciuto come nome mangling . Su Windows, la convenzione cdecl aggiunge un singolo trattino basso (altre convenzioni hanno schemi più complicati).

Potrebbe essere che non è stata specificata la convenzione di chiamata in modo corretto quando si costruisce la libreria GSL. Si dovrebbe essere in grado di avere uno sguardo a quali nomi vengono esportati utilizzando objdump .

Non GSL forniscono già involucri SWIG?

Si prega di dare un'occhiata al CythonGSL ( https://github.com/twiecki/CythonGSL ) quando si desidera utilizzare le funzioni di GSL in Cython.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top