2011-01-13 12 views
31

में डाइलिब का उपयोग कैसे करें मैंने कुछ एप्लिकेशन को सफलतापूर्वक कॉल करने के लिए एक एप्लिकेशन (निष्पादन योग्य) बनाया है, हालांकि, डाइलिब फ़ाइलें और निष्पादन योग्य विभिन्न निर्देशिका में हैं। मैंने निर्देशिका में $ पाथ पर्यावरण परिवर्तक में dylib फ़ाइलों को जोड़ा है, हालांकि, यह अभी भी लोड नहीं होता है। मैं सभी dylib फ़ाइलों को निष्पादन योग्य में कॉपी करता हूं, कार्यक्रम अंततः चलता है। यह पुष्टि करता है कि dylib फ़ाइलों में कोई समस्या नहीं है। हालांकि, मैं ओएस को यह कैसे ढूंढ सकता हूं? विंडोज़ में, मुझे केवल निर्देशिका पथ को जोड़ने की आवश्यकता है जिसमें डीएलएल फाइलें $ PATH तक हैं। मैक ओएस एक्स के लिए मुझे क्या करने की ज़रूरत है? बहुत बहुत धन्यवाद!मैक ओएस एक्स (सी ++)

+4

'otool -L ऐप 'का उपयोग करके अपने ऐप की निर्भरता की जांच करें। यदि उन्हें पूर्ण पथ के रूप में हार्डकोड किया गया है तो उन्हें रिश्तेदार बनने के लिए 'install_name_tool -change पुरानी नई फ़ाइल' का उपयोग करके संशोधित करें। उसके बाद लिंकर को आपके 'DYLD_LIBRARY_PATH' पर्यावरण चर में एक लाइब्रेरी मिल सकती है। – aponomarenko

उत्तर

2

यदि लाइब्रेरी के INSTALL_NAME द्वारा निर्दिष्ट स्थान पर डाइलिब है, तो यह बस कार्य करेगा *।

अन्यथा, आप डाइलीब का स्थान DYLD_LIBRARY_PATH में जोड़ सकते हैं। आप dyld documentation पढ़ना चाहेंगे।

*) पूरी तरह से सटीक होने के लिए, इसे DYLD_ROOT_PATH/INSTALL_NAME पर होना आवश्यक है, लेकिन DYLD_ROOT_PATH के साथ झगड़ा बहुत दुर्लभ है।

+0

क्षमा करें, "पुस्तकालय का INSTALL_NAME" क्या है? मैं DYLD_LIBRARY_PATH जोड़ता हूं और यह काम नहीं करता है, इसलिए उलझन में है। –

+0

आपको चर निर्यात करने की आवश्यकता है: निर्यात DYLD_LIBRARY_PATH =/usr/local/lib' – Michel

13

आपको DYLD_LIBRARY_PATH पर्यावरण चर सेट करने की आवश्यकता है।

dyld man page से

:

 This is a colon separated list of directories that contain libraries. The dynamic linker 
     searches these directories before it searches the default locations for libraries. It allows 
     you to test new versions of existing libraries. 

     For each library that a program uses, the dynamic linker looks for it in each directory in 
     DYLD_LIBRARY_PATH in turn. If it still can't find the library, it then searches DYLD_FALL- 
     BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn. 
+0

धन्यवाद! मैंने इसे Google द्वारा भी पाया, मैंने DYLD_LIBRARY_PATH सेट किया था, हालांकि, यह काम नहीं करता है, समस्या अभी भी है! मैं बहुत भ्रमित हूं –

+0

मैंने अभी कोशिश की है और यह मेरे मैक पर बहुत अच्छा काम करता है। – EmeryBerger

+0

हाय, एमरीबर्गेर, क्या आप मूल रूप से खाली DYLD_LIBRARY_PATH चर हैं। मेरा है। मुझे नहीं पता कि यह पहली जगह गलत है या नहीं। –

34

लिंक है कि जस्टिन प्रदान की पढ़ने के बाद, मैं सफलतापूर्वक @executable_path टोकन का उपयोग करना ही dir जहाँ मेरे निष्पादन स्थित है को इंगित करने के लिए अपने dylib install_name को बदलने में सक्षम था।

@executable_path निरपेक्ष पथ कष्टप्रद है। कभी-कभी आप फ्रेमवर्क/लाइब्रेरी या इसी तरह के स्थान पर ढांचे को स्थापित करने के बजाय किसी एप्लिकेशन में ढांचे को एम्बेड करना चाहते हैं।

मैक का समाधान @executable_path है। यह एक जादू टोकन है, जिसे लाइब्रेरी के इंस्टॉल नाम की शुरुआत में रखा गया है, इसे लोड करने वाले निष्पादन योग्य के पथ तक विस्तारित हो जाता है, अंतिम घटक को घटाएं। उदाहरण के लिए, मान लें कि Bar.app Foo.framework के विरुद्ध लिंक करता है। यदि Bar.app/अनुप्रयोगों में स्थापित है, @executable_path /Applications/Bar.app/Contents/MacOS तक विस्तारित होगा। यदि आप सामग्री/फ्रेमवर्क में ढांचे को एम्बेड करना चाहते हैं, तो आप केवल Foo.framework के इंस्टॉल नाम को @executable_path /../ फ्रेमवर्क/Foo.framework/संस्करण/ए/फू पर सेट कर सकते हैं। डायनामिक लिंकर /एप्लिकेशन/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo तक विस्तारित करेगा और वहां ढांचे को मिलेगा।

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

मैं एक उदाहरण के साथ प्रदर्शन करेंगे।

चलो कहते हैं कि मैं निम्नलिखित निष्पादन /opt/स्थानीय/बिन है/परिवर्तित और उसके dylibs स्थानीय/lib में /opt/हैं करते हैं। मैं इसे किसी अन्य डीआईआर में कॉपी करना चाहता हूं और इसे उसी निर्देशिका से अपनी डाइलीब लोड करना चाहता हूं जहां मैंने निष्पादन योग्य की प्रतिलिपि बनाई है।

> mkdir ~/tmp/bin 
> cp /opt/local/bin/convert ~/tmp/bin 

जाओ निष्पादनयोग्य की एक सूची dylibs

> otool -L ~/tmp/bin/convert 
~/tmp/bin/convert: 
    /opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    /opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) 
    /opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) 
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) 
    /opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) 
    /opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) 
    /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) 
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) 
    ... 

मैं केवल /opt/स्थानीय/lib dir में dylibs के बारे में परवाह है, तो हम में केवल dylibs बाहर खींच/चुनते । मैं अन्य सभी dylib संदर्भों को विशेष रूप से /usr/lib/libSystem सामान से बरकरार रखना चाहता हूं।

> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print $1 }'` 

सभी dylibs कॉपी है कि एक ही निर्देशिका जहां निष्पादन को कॉपी किया गया है के लिए निष्पादन योग्य संदर्भ।

> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done; 

install_name_tool का प्रयोग करें सभी dylibs हम आपको उपरोक्त चरण में बाहर निकाला का नाम स्थापित बदलने के लिए, और उन्हें dylib नाम के @executable_path prepending द्वारा की जगह। यह गतिशील लिंकर को उसी निर्देशिका में डाइलीब के लिए देखेगा जहां निष्पादन योग्य स्थित है।

> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done; 

पुष्टि करें कि नाम स्थापित बदल दिया गया है और कहा कि libSystem अभी भी /usr/lib/libSystem की ओर इशारा करते है।

> otool -L ~/tmp/bin/convert 
~/tmp/bin/convert: 
    @executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    @executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) 
    @executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) 
    @executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) 
    @executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) 
    @executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) 
    @executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) 
    @executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) 
    ... 
+0

ध्यान दें कि ऐसा प्रतीत होता है कि आपको प्रत्येक लाइब्रेरी फ़ाइल के लिए भी ऐसा करना है, क्योंकि उनमें पूर्ण पथ के लिंक भी हो सकते हैं – Claudiu