Próbuję odtworzyć pracę Flavian Coelho, linked here. Użył Cythona i Biblioteki Naukowej Gnu (GSL), aby uzyskać ogromne przyspieszenie w Pythonie przy generowaniu liczb losowych. Kiedy zaimportować skompilowany kod Cython w Pythonie (poleceniem import cgibbs
), pojawia się następujący błąd:ImportError z Cython podczas łączenia zewnętrznej biblioteki C
ImportError: dlopen(./cgibbs.so, 2): Symbol not found: _gsl_rng_mt19937
Referenced from: /Users/wesley/scratch/cython/cgibbs.so
Expected in: dynamic lookup
Zauważysz, że skarga jest to, że symbol _gsl_rng_mt19937
nie można znaleźć. Funkcja, do której próbuję się połączyć, nazywa się gsl_rng_mt19937
(bez wiodącego podkreślenia) i tak wygląda w moim pliku .pyx
. Myślę, że Cython w jakiś sposób powoduje problem poprzez dodanie tego wiodącego podkreślenia.
W celu ułatwienia rozwiązywania problemów, usunąłem kod i opublikowałem go poniżej. Mój system to: Mac OSX 10.7 (Lion) z uruchomionym Pythonem 2.7.2 (32-bit), gcc-4.0 (z którego korzystałem podczas kompilowania bibliotek GSL w wersji 32-bitowej), GSL 1.15 i Cython v0.15.1.
Oto treść 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)
Błąd odchodzi gdybym wykomentuj ostatnią linię moich cgibbs.pyx
, ale wtedy nie mogę faktycznie korzysta z zewnętrznej biblioteki ... Wszelkie wgląd, który możesz zaoferować, jest doceniany. Dzięki!
Nie wiem od SWIG - może powinienem jednak. – Wesley