LD_LIBRARY_PATH बनाम LIBRARY_PATH


159

मैं एक साधारण सी ++ प्रोग्राम बना रहा हूं और मैं इसे हाल ही के संस्करण के साथ साझा लाइब्रेरी को सप्लाई करने के लिए विकास और परीक्षण के लिए अस्थायी रूप से स्थानापन्न करना चाहता हूं।

मैंने LD_LIBRARY_PATH वैरिएबल सेट करने की कोशिश की लेकिन लिंकर (ld) इसके साथ विफल रहा:

/ usr / bin / ld: -lyaml-cpp नहीं मिल सकता है

मुझे उम्मीद थी कि काम करने के लिए क्योंकि ld मैन पेज के अनुसार:

लिंकर आवश्यक साझा पुस्तकालयों का पता लगाने के लिए निम्नलिखित खोज पथों का उपयोग करता है: ... एक मूल लिंकर के लिए, पर्यावरण चर "LD_LIBRARY_PATH" की सामग्री ...

मैंने तब LIBRARY_PATH की स्थापना की कोशिश की, और यह काम किया।

जीसीसी मैनुअल के अनुसार:

LIBRARY_PATH का मूल्य निर्देशिकाओं की एक बृहदान्त्र-पृथक सूची है, बहुत कुछ PATH की तरह। मूल संकलक के रूप में कॉन्फ़िगर किए जाने पर, जीसीसी इस प्रकार निर्दिष्ट निर्देशिकाओं की कोशिश करता है जब विशेष लिंकर फ़ाइलों की खोज करते हैं, अगर यह उन्हें GCC_EXEC_PREFIX का उपयोग करके नहीं मिल सकता है। जीसीसी का उपयोग करके लिंक करना भी इन निर्देशिकाओं का उपयोग करता है जब -l विकल्प के लिए सामान्य पुस्तकालयों की खोज करते हैं (लेकिन -L के साथ निर्दिष्ट निर्देशिका पहले आते हैं)।

जैसा कि (GCC) मैनुअल बताता है, LIBRARY_PATH काम करता है क्योंकि मैं GCC से लिंक करता हूं।

परंतु..

  • चूंकि मैं जीसीसी के साथ लिंक करता हूं, इसलिए एलडी को क्यों बुलाया जा रहा है, जैसा कि त्रुटि संदेश से पता चलता है?
  • एक ही उद्देश्य से दो चर होने की बात क्या है? क्या कोई अन्य मतभेद हैं?

जवाबों:


213

LIBRARY_PATH स्थैतिक और साझा पुस्तकालयों वाले खोज निर्देशिकाओं के संकलन से पहले gcc द्वारा उपयोग किया जाता है जिन्हें आपके प्रोग्राम से जोड़ा जाना चाहिए।

LD_LIBRARY_PATHआपके प्रोग्राम द्वारा निर्देशिकाओं को साझा पुस्तकालयों से खोजने के लिए उपयोग किया जाता है क्योंकि इसे सफलतापूर्वक संकलित और लिंक किया गया है।

संपादित करें: जैसा कि नीचे बताया गया है, आपके पुस्तकालय स्थिर या साझा किए जा सकते हैं। यदि यह स्थिर है, तो कोड आपके प्रोग्राम में कॉपी कर लिया जाता है और आपके प्रोग्राम को संकलित और लिंक किए जाने के बाद आपको लाइब्रेरी की खोज करने की आवश्यकता नहीं है। यदि आपकी लाइब्रेरी साझा की जाती है, तो इसे गतिशील रूप से आपके प्रोग्राम से जोड़ा जाना चाहिए और जब यह LD_LIBRARY_PATHखेल में आता है।


14
और बेशक LD_LIBRARY_PATH केवल गतिशील पुस्तकालयों के साथ समझ में आता है
एलेक्स जैस्मीन

2
मेरा कहना यह है कि अगर मैं (सीधे) लिंक करने के लिए ld का उपयोग करता था, तो, ld मैनुअल के अनुसार, LD_LIBRARY_PATH का उपयोग उन निर्देशिकाओं को खोजने के लिए किया जाता था, जिन्हें मेरे प्रोग्राम से लिंक करने की आवश्यकता होती है। मुझे यहाँ कुछ याद आ रहा है ..
जॉर्जियोस पोलिटिस

2
जब तक आप स्वयं को आमंत्रित नहीं करते हैं और पुस्तकालयों के साथ ऑब्जेक्ट फ़ाइलों को संयोजित करते हैं, तब तक यह उस मार्ग को 'विरासत में' लेगा, जो इस मार्ग से गुजरता है। -Xlinker विकल्पों के साथ आप मानक gcc को ओवरराइड कर सकते हैं।
नवीन

5
वास्तव में, केवल स्थिर पुस्तकालयों के बजाय LIBRARY_PATH स्थिर और गतिशील पुस्तकालयों वाले निर्देशिकाओं को खोजने के लिए उपयोग किया जाता है ।
particle128

3
हाँ यह गलत है - अंतर यह है कि संकलन समयLIBRARY_PATH पर पुस्तकालयों (स्थिर या गतिशील) के लिए खोजा जाता है और रन समय के लिए गतिशील पुस्तकालयों के लिए खोज की जाती है। बेशक रन टाइम में आपको स्टैटिक लाइब्रेरी की तलाश करने की जरूरत नहीं है। LD_LIBRARY_PATH
टिम्मम

47

LD_LIBRARY_PATHजब प्रोग्राम शुरू होता है, LIBRARY_PATHतो लिंक समय पर खोजा जाता है।

टिप्पणियों से चेतावनी :


38
नोट: जब पुस्तकालयों को जोड़ने, ldअपने आप में से किसी में पुस्तकालयों के लिए नहीं लग रही है LIBRARY_PATHया LD_LIBRARY_PATH। यह केवल जब है gccका आह्वान ldहै कि LIBRARY_PATHहो जाता है इस्तेमाल किया। (इस कठिन तरीके से
सीखें

1
@ रफलविंड दिलचस्प, लेकिन अगर आपने कोई संदर्भ दिया होता तो और भी अधिक होता।
हमीज़ेल ने

यह दृश्य उस क्षण में अंतर करता है जब पुस्तकालयों को खोजा जाता है (लिंक समय बनाम रन समय) जबकि @ नवीन उन पुस्तकालयों के प्रकार का अंतर बनाता है जिन्हें (स्थिर v गतिशील) के लिए खोजा जाता है। क्या दो विचार प्रभावी रूप से समान हैं (गतिशील: रन टाइम = स्थिर: लिंक समय) या क्या महत्वपूर्ण परिस्थितियां हैं जब यह पत्राचार पकड़ में नहीं आता है? मुझे लगता है कि गतिशील पुस्तकालयों के बारे में कुछ ज्ञान संकलन समय पर भी आवश्यक है।
XavierStuvw

13

चूंकि मैं gcc से लिंक करता हूं कि ld क्यों कहा जा रहा है, जैसा कि त्रुटि संदेश से पता चलता है?

जब यह लिंकिंग मोड में होता है तो gcc आंतरिक रूप से ld कहता है।

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