2012-12-18 12 views
11

हम MATLAB MEX फ़ाइलों है कि हमारे संचार पुस्तकालय का उपयोग के एक नंबर बना रहे हैं से अलग। यह संचार पुस्तकालय बूस्ट का बहुत उपयोग करता है। अब, MATLAB आंतरिक रूप से बढ़ावा देने का भी उपयोग करता है, जिसका अर्थ है कि एक मानक सेटअप में, हम MATLAB या सभी नरक ensues के साथ आने वाले एक बूस्ट संस्करण का उपयोग नहीं कर सकते हैं।का उपयोग को बढ़ावा देने, MATLAB के संस्करण

समस्या है, को बढ़ावा देने संस्करण है कि matlab (को बढ़ावा देने के 1.40) के बारे में हमारी संदर्भ संस्करण के साथ आता काफी पुराना है और कुछ कीड़े है। हम एक नए संस्करण का उपयोग करना चाहते हैं।

एकमात्र समाधान मुझे लगता है कि एक अलग नाम स्थान में रहता है को बढ़ावा देने के एक कस्टम संस्करण बनाने के लिए है। नाम बदलने के बाद नामकरण विवादों को रोकना चाहिए। यह समाधान थोड़ा मुश्किल है क्योंकि बूस्ट कुछ "सी" प्रतीकों को भी निर्यात करता है और इसमें कई मैक्रो हैं जिन्हें सभी को बदलने की आवश्यकता होगी।

वहाँ कि कस्टम बढ़ावा संस्करणों के निर्माण की आवश्यकता नहीं है किसी भी सिफारिश समाधान कर रहे हैं?

+0

क्या आपने अपनी बूस्ट लाइब्रेरी का पूरा पथ '-l' विकल्प के साथ निर्दिष्ट करने का प्रयास किया था? –

+0

यह क्यों मायने रखता है? मैं इसे कल किसी भी तरह से कोशिश करूँगा, बस जिज्ञासा। – Ives

+0

शायद इस तरह यह MATLAB के बजाए आपकी बूस्ट लाइब्रेरी से लिंक कर सकता है। –

उत्तर

9

एक समाधान, जिस तरह से matlab अपने प्लगइन खोलता बदलने के लिए है जो अपने आप को बढ़ावा देने पर कोई निर्भरता है एक छोटा सा लोडर MEX फ़ाइल लिख कर है, यह foo.mexglx

फोन यह mexFunction कॉल बस इस

करता है
void mexFunction (int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) 
{ 
    gMexEntry (nlhs, plhs, nrhs, prhs); 
} 

जहां gMexEntry चर एक समारोह सूचक के रूप में

typedef void (*entryfunc_t)(int, mxArray**, int, const mxArray**); 
entryfunc_t gMexEntry; 

और घोषित किया जाता है मॉड्यूल लोड होने पर एक स्थिर कन्स्ट्रक्टर द्वारा पॉप्युलेट किया जाता है (ब्रेवटी के लिए अनदेखा सभी त्रुटि जांच)।

fh = dlopen ('bar.mexglx', RTLD_NOW | RTLD_DEEPBIND); 
void * p = dlsym (fh, "mexFunction"); 
gMexEntry = reinterpret_cast<entryfunc_t> (p); 

घटनाओं की श्रृंखला है कि जब मैटलैब अपने फ़ंक्शन को कॉल करने, कोई बढ़ावा निर्भरता के साथ पतली आवरण dlopen की RTLD_DEEPBIND विकल्प, जो देखने गुंजाइश रख देगा का उपयोग कर बढ़ावा निर्भरता के साथ अपने समारोह खुलेगा इस पुस्तकालय में प्रतीकों में से वैश्विक क्षेत्र (Matlab के पुराने बढ़ावा उपयोग करते हुए) से आगे (बढ़ावा के अपने संस्करण का उपयोग)। फिर वास्तविक मैक्सफंक्शन कॉल बार को अग्रेषित करेगा।

आप अपने cmdline सही ढंग से जोड़ने, 'ldd' का उपयोग करते हैं, तो आप यह देखना चाहिए कि 'foo.mexglx' को बढ़ावा देने पर कोई निर्भरता है, और 'bar.mexglx' अपने सभी सामान्य निर्भरता है।

मैं असफलता का कोई स्पष्ट संकेत के साथ महीनों के लिए भारी इस तकनीक का इस्तेमाल किया गया है। मुझे अभी भी कुछ मामूली चिंताएं हैं कि जो कुछ मुझे समझ में नहीं आता वह गलत हो सकता है, लेकिन उस समय के लिए यह एकमात्र समाधान है (एमएक्सएरे इंटरफ़ेस को दोहराने वाला एक पूर्ण आउट-ऑफ-प्रोसेस निष्पादन इंजन लिखने के अलावा और पाइप के साथ संचार, या स्थिर रूप से सब कुछ जोड़ने जो मेरी स्थिति के लिए व्यावहारिक नहीं है)

+2

मान लीजिए कि आप _foo.mexglx_ के समान स्थान पर लोड करने के लिए अन्य मेक्स पुस्तकालयों को स्थापित कर रहे हैं, तो मैं _foo.mexglx_ बनाते समय लिंकर झंडे में '-Wl, -rpath -Wl, $ ORIGIN' जोड़ने का सुझाव देता हूं ताकि आप नहीं कर सकें 'dlopen' के माध्यम से पुस्तकालयों को लोड करने का प्रयास करते समय' LD_LIBRARY_PATH' आदि के साथ मिलना होगा। – eric

संबंधित मुद्दे