पता लगाएँ कि क्या पुस्तकालय मार्ग में है


15

अगर मैं एक पुस्तकालय स्थापित है और एक कार्यक्रम के द्वारा प्रयोग करने योग्य है मैं परीक्षण करना चाहते हैं। मैं ldconfig -p | grep mylibयह पता लगाने के लिए उपयोग कर सकता हूं कि यह सिस्टम पर स्थापित है या नहीं। लेकिन क्या होगा अगर लाइब्रेरी केवल सेटिंग के माध्यम से जाना जाता है LD_LIBRARY_PATH?

उस स्थिति में, प्रोग्राम लाइब्रेरी को खोजने में सक्षम हो सकता है, लेकिन ldconfigऐसा नहीं होगा। यदि लाइब्रेरी संयुक्त लिंकर पथ में है तो मैं कैसे जांच सकता हूं ?

मैं जोड़ूंगा कि मैं एक समाधान की तलाश कर रहा हूं जो काम करेगा भले ही मेरे पास वास्तव में कार्यक्रम नहीं है (उदाहरण के लिए कार्यक्रम अभी तक संकलित नहीं है), मैं सिर्फ यह जानना चाहता हूं कि एक निश्चित पुस्तकालय मौजूद है ld' के पथ।


2
आप यह ldd <binary>जांचने के लिए उपयोग कर सकते हैं कि सभी लाइब्रेरी लिंक्ड पथ में हैं या नहीं। शायद एक और अधिक सुंदर तरीका है।
थॉमस

@ थोमस मुझे लगता है कि आपको अपनी टिप्पणी का जवाब देना चाहिए। lddठीक इसी उद्देश्य से कार्य करता है।
--16

1
@ थोमस - लेकिन क्या होगा अगर मैं कार्यक्रम अभी तक संकलित नहीं किया गया हूं, और संकलन के लिए उस पुस्तकालय की आवश्यकता है?
nbubis

@Igeorget - मेरा संपादन / टिप्पणी देखें
nbubis

@nbubis: जब आपको संकलन के लिए पुस्तकालय की आवश्यकता होती है, तो आपको आमतौर पर LIBRARY_PATHपर्यावरण चर का उपयोग करना पड़ता है जो gccसंकलक द्वारा देखा जाता है । LIBRARY_PATHवातावरण चर भी निर्देशिका के पेट के अलग सूची है।
थॉमस

जवाबों:


15

ldconfig उन सभी पुस्तकालयों को सूचीबद्ध कर सकता है जिनके पास इसकी पहुंच है। इन पुस्तकालयों को भी इसके कैश में संग्रहित किया जाता है।

/sbin/ldconfig -v -Nसभी सामान्य लाइब्रेरी पथ को क्रॉल करेंगे, कैश को फिर से संगठित किए बिना सभी उपलब्ध पुस्तकालयों को सूचीबद्ध करें (जो कि यदि आप एक गैर-रूट उपयोगकर्ता हैं तो संभव नहीं है)। यह LD_LIBRARY_PATH में खाता पुस्तकालयों में नहीं है (इसके विपरीत इस पोस्ट को संपादित करने से पहले क्या कहा गया है) लेकिन आप नीचे दिए गए लाइन का उपयोग करके कमांड लाइन में अतिरिक्त लाइब्रेरी पास कर सकते हैं:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig 1980 के दशक का एक उपकरण है जिसे 1990 के दशक में दिया गया था। इस कारण से, ldconfigपोर्टेबल नहीं है क्योंकि यह केवल उन कार्यान्वयनों पर लागू होता है जो a.out1987 से SunOS-4.0 आधारित डायनामिक लिंकर पर आधारित हैं।
sch '10

यह उन लिबासों को सूचीबद्ध करने में कैसे मदद करता है जो केवल LD_LIBRARY_PATH पर हैं? मुझे लगता है कि मैं पार्स करने के लिए एक स्क्रिप्ट लिख सकता हूं और फिर पढ़ सकता हूं कि ldconfig के माध्यम से, लेकिन यह एक ओवर किल जैसा लगता है।
nbubis

1
@nbubis आप हमेशा ldconfig में LD_LIBRARY_PATH में लाइब्रेरी पास कर सकते हैं। /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)मेरे स्वाद के लिए बहुत ज्यादा ओवरकिल की तरह नहीं।
lgeorget

@ सच में? यह ईएलएफ पुस्तकालयों के साथ बहुत अच्छा काम करता है जहां तक ​​मैं बता सकता हूं। और यह अभी भी उपयोग किया जाता है, ld.so ldconfig द्वारा निर्मित कैश पर निर्भर करता है।
lgeorget

लिनक्स लोगों ने ईएलएफ का समर्थन करने के लिए पुराने सन लिंकर स्रोत-कोड को हैक कर लिया। Sun से नया ELF कार्यान्वयन ldconfigAT & T के साथ एक समझौते में हटा दिया गया क्योंकि लिंकर कैशिंग त्रुटियों के प्रति बहुत संवेदनशील था। सूर्य ने बाद में कहा the tree stooges: moe, lariऔर crleELF प्रबंधन के लिए सहायक कार्यक्रमों के रूप में।
शास्त्री

2

:LD_LIBRARY_PATH के लिए वैश्विक रूप से स्थानापन्न (स्थान)

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

आप gcc के साथ एक साधारण परीक्षा कार्यक्रम संकलित कर सकते हैं और अपने पुस्तकालय को लिंक कर सकते हैं। फिर आप उपयोग किए गए पुस्तकालयों को ldd के साथ जांच सकते हैं। मैं कुछ इस तरह का उपयोग करें:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed लिंक करने वाले को लाइब्रेरी से बाहर जाने से रोकता है, क्योंकि लाइब्रेरी से कोई भी प्रतीक का उपयोग नहीं किया जाता है।

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