मैं फ्लैवियन कोलोहो, linked here के काम को दोहराने की कोशिश कर रहा हूं। उन्होंने सिथॉन और जीएनयू वैज्ञानिक पुस्तकालय (जीएसएल) का इस्तेमाल किया ताकि वे यादृच्छिक संख्या उत्पन्न करने में पाइथन पर भारी गति प्राप्त कर सकें। जब मैं अजगर में मेरी संकलित Cython कोड आयात (आदेश 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
फ़ाइल में दिखाई देता है। मुझे लगता है कि साइथन किसी भी तरह से अग्रणी अंडरस्कोर जोड़कर समस्या पैदा कर रहा है।
समस्या निवारण को आसान बनाने के लिए, मैंने कोड को तोड़ दिया है और इसे नीचे पोस्ट किया है। मेरा सिस्टम है: मैक ओएसएक्स 10.7 (शेर) पाइथन 2.7.2 (32-बिट), जीसीसी-4.0 (जिसे मैं 32-बिट फॉर्म में जीएसएल पुस्तकालयों को संकलित करने के लिए उपयोग करता था), जीएसएल 1.15, और साइथन 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
की अंतिम पंक्ति बाहर टिप्पणी है, लेकिन फिर मैं वास्तव में बाहरी पुस्तकालय का उपयोग नहीं कर सकते हैं ... कोई भी अंतर्दृष्टि जो आप पेशकश कर सकते हैं सराहना की है। धन्यवाद!
मैं बड़ा घूँट से पता नहीं है - शायद मैं करने के लिए है, हालांकि चाहिए। – Wesley