उस पथ को जोड़ें जहां आपकी नई लाइब्रेरी है LD_LIBRARY_PATH
(यह मैक पर थोड़ा अलग नाम है ...)
आपके समाधान को -L/my/dir -lfoo
विकल्प का उपयोग करके काम करना चाहिए , रनटाइम पर LD_LIBRARY_PATH का उपयोग करके अपने पुस्तकालय के स्थान को इंगित करें।
LD_LIBRARY_PATH के उपयोग से सावधान - संक्षेप में (लिंक से):
..implication ..:: यह सबसे आम समस्या है। LD_LIBRARY_PATH एक साझा लाइब्रेरी को लोड करने के लिए एक एप्लिकेशन को इसके खिलाफ लिंक नहीं किया गया था, और यह मूल संस्करण के साथ संगत नहीं होने की संभावना है। यह या तो बहुत स्पष्ट हो सकता है, अर्थात एप्लिकेशन क्रैश हो सकता है, या यह गलत परिणाम दे सकता है, यदि उठाया गया पुस्तकालय काफी नहीं करता है जो मूल संस्करण ने किया होगा। विशेष रूप से उत्तरार्द्ध कभी-कभी डिबग करना कठिन होता है।
सुरक्षा : याद रखें कि LD_LIBRARY_PATH में निर्दिष्ट निर्देशिकाओं को मानक सिस्टम स्थानों से पहले (?) खोजा जाता है? इस तरह, एक बुरा व्यक्ति एक साझा पुस्तकालय के एक संस्करण को लोड करने के लिए आपका आवेदन प्राप्त कर सकता है जिसमें दुर्भावनापूर्ण कोड होता है! यही कारण है कि setuid / setgid निष्पादक उस चर की उपेक्षा करते हैं!
प्रदर्शन: लिंक लोडर को निर्दिष्ट सभी निर्देशिकाओं को खोजना होता है, जब तक कि वह निर्देशिका नहीं मिलती है जहां साझा पुस्तकालय रहता है - सभी साझा पुस्तकालयों के लिए आवेदन के खिलाफ लिंक किया गया है! इसका मतलब है कि बहुत सारे सिस्टम कॉल को खोलने के लिए (), जो "ENOENT (ऐसी कोई फ़ाइल या निर्देशिका नहीं)" के साथ विफल हो जाएगा! यदि पथ में कई निर्देशिकाएं हैं, तो विफल कॉल की संख्या रैखिक रूप से बढ़ जाएगी, और आप यह बता सकते हैं कि आवेदन के स्टार्ट-अप समय से। यदि निर्देशिकाओं में से कुछ (या सभी) एक एनएफएस वातावरण में हैं, तो आपके अनुप्रयोगों का स्टार्ट-अप समय वास्तव में लंबा हो सकता है - और यह पूरे सिस्टम को धीमा कर सकता है!
बेजोड़ता
या
लिंकर - रनटाइम लाइब्रेरी खोज पथ के लिए gcc के माध्यम से rpath विकल्प का उपयोग करें, मानक dir (gcc विकल्प) में देखने के बजाय उपयोग किया जाएगा:
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
यह एक अस्थायी समाधान के लिए अच्छा है। लिंकर पहले मानक निर्देशिकाओं को देखने से पहले पुस्तकालयों के लिए LD_LIBRARY_PATH की खोज करता है।
यदि आप LD_LIBRARY_PATH को स्थायी रूप से अपडेट नहीं करना चाहते हैं, तो आप इसे कमांड लाइन पर फ्लाई पर कर सकते हैं:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
आप देख सकते हैं कि पुस्तकालयों के लिंकर का उपयोग करने के बारे में क्या पता है (उदाहरण):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
और आप जांच सकते हैं कि आपका आवेदन किस पुस्तकालय का उपयोग कर रहा है:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
फ़ाइलें मौजूद हैं और जहां -.so
w / ओ.0
,.a
, आदि आदि?