मैं मैक OS X पर DYLD_LIBRARY_PATH को कहां सेट करूं और क्या यह एक अच्छा विचार है?


28

मैं अपने मैक (OS X) पर C ++ में लिखा एक सॉल्वर स्थापित करने की कोशिश कर रहा हूं, कोड के साथ उपयोग करने के लिए मैंने एक्सकोड में लिखा है।

सॉल्वर प्रलेखन यह कहता है:

होना सुनिश्चित करें "।" DYLD_LIBRARY_PATHकरने के लिए अपने आदेश में

  • तैयार-निर्मित निष्पादनयोग्य चलाएं
  • libamg.dylib (और gfortran RTSlibs) के साथ लिंक

मैं वास्तव में यह क्या मतलब है समझ में नहीं आता है। मुझे कहाँ और क्या बदलने की आवश्यकता है?

मैंने कुछ गुगली की है, लेकिन मेरे जैसे एक नौसिखिया के लिए काफी सरल कुछ भी नहीं आया है! अगर कोई रोगी व्यक्ति है जो मुझे ऑनलाइन संसाधन के लिए निर्देशित करने या पर्यावरण चर को कैसे और कहाँ सेट करने के लिए मुझे नहीं दे रहा है, तो मुझे बहुत आभारी होंगे।

जवाबों:


20

यह एक पर्यावरण चर है और जैसा कि आमतौर पर टर्मिनल द्वारा निर्धारित किया जाता है

export DYLD_LIBRARY_PATH=someValue

man dyld कहते हैं:

DYLD_LIBRARY_PATH

यह निर्देशिकाओं की एक अलग-अलग सूची है जिसमें लाइब्रेरी शामिल हैं। डायनामिक लिंकर इन निर्देशिकाओं को खोजता है इससे पहले कि यह पुस्तकालयों के लिए डिफ़ॉल्ट स्थानों को खोजे। यह आपको मौजूदा पुस्तकालयों के नए संस्करणों का परीक्षण करने की अनुमति देता है।

प्रत्येक लाइब्रेरी के लिए जो एक प्रोग्राम का उपयोग करता है, डायनेमिक लिंकर DYLD_LIBRARY_PATHबदले में प्रत्येक निर्देशिका में इसके लिए दिखता है । यदि यह अभी भी पुस्तकालय को नहीं खोज सकता है, तो यह खोज DYLD_FALLBACK_FRAMEWORK_PATHऔर DYLD_FALLBACK_LIBRARY_PATHबदले में।

के -Lविकल्प का उपयोग करें otool(1)। उन रूपरेखाओं और साझा पुस्तकालयों की खोज करना, जिनके खिलाफ निष्पादन योग्य जुड़ा हुआ है।


आप शायद ऐसा कुछ चाहते हैं

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

आगे जोड़ते लिए .स्थानों की सूची के लिए (वर्तमान निर्देशिका) की खोज। मेरे अनमॉडिफाइड OS X पर, DYLD_LIBRARY_PATHहालांकि वर्तमान मूल्य नहीं है:

$ echo $DYLD_LIBRARY_PATH

$

इस बात पर निर्भर करते हुए कि आप अपने कार्यक्रम को चलाने का इरादा कैसे करते हैं, आपको इसे अलग तरह से सेट करने की आवश्यकता होगी, उदाहरण के लिए Xcode (मुझे नहीं पता कि हालांकि)।


1
मैं @TVNshack से सहमत आप आमतौर पर होना चाहिए कि नहीं सेट DYLD_LIBRARY_PATHहै और न ही DYLD_FRAMEWORK_PATHहै, क्योंकि यह प्रणाली के द्वारा उपलब्ध कराया libs लगाने के लिए उन भरी हुई libs रोक सकता है। उस काम को बेहतर बनाने के लिए, FALLBACKसंस्करणों के बजाय उपयोग करें । इस उत्तर में अधिक जानकारी: stackoverflow.com/a/3172515/43615
सुपर टैम्पेल

21

किसी को भी export DYLD_LIBRARY_PATHआपके सिस्टम पर सेट नहीं होना चाहिए ।

साझा पुस्तकालय पथ का उपयोग करके तय किया जा सकता है otool -Lऔर install_name_tool

उदाहरण के लिए, यदि आप पर्ल DBD-MySQL संकलित करते हैं तो आप इसका उपयोग नहीं कर पाएंगे क्योंकि लिंकर को यह पता नहीं होता है कि आपने MySQL कहाँ स्थापित किया है।

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

यह उतना ही सरल है।


त्वरित FYI: install_name_tool चुपचाप विफल हो जाता है यदि नया पथ उसके द्वारा प्रतिस्थापित किए जा रहे पथ से अधिक लंबा है। हमेशा verify ओटूल-एल ’के साथ सत्यापित करें कि पथ अपेक्षित रूप से बदल गया था।
user15685

मान लीजिए कि मैं एक प्लग इन (मूल रूप से एक गतिशील लाइब्रेरी अपने आप में) संकलित करता हूं, जो दूसरे डायनामिक लाइब्रेरी पर निर्भर करता है। मुझे अन्य उपयोगकर्ताओं के लिए प्लग इन और उसकी निर्भरता की आपूर्ति कैसे करनी चाहिए?
रॉय

यदि आप इसके बजाय सेट करते हैं DYLD_FALLBACK_FRAMEWORK_PATH, तो यह इस मामले में काम करता है । यह लिबास के आंतरिक रास्तों को बदलने की तुलना में बहुत आसान है, खासकर यदि आपको अपने ऐप के साथ निर्मित डायलिब्स को वितरित करने की आवश्यकता है और वे उस पथ की भविष्यवाणी नहीं कर सकते हैं जो वे समाप्त होते हैं।
सुपर टैम्पेल

7

Xcode 4 में आप इसे इस तरह की त्रुटियों से बचने के लिए प्रोजेक्ट स्कीम में जोड़ सकते हैं:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. मेनू में "उत्पाद" -> "संपादित करें योजना" -> "तर्क" टैब पर -> "पर्यावरण चर" जोड़ें -> कुंजी: DYLD_LIBRARY_PATH मान: / उपयोगकर्ता / MyUserAccount (पथ / / से / lib

  2. अपने उपयोगकर्ता खाते के पथ और लाइब्रेरी फ़ोल्डर के लिए पूर्ण पथ बदलें।

  3. आपको निर्माण और चलाने में सक्षम होना चाहिए।

Xcode 4 में DYLD_LIBRARY_PATH सेट करना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.