gcc - क्यों-एल की आवश्यकता है जब-rpath का उपयोग किया जाता है?




linker shared-libraries (2)

मुझे लगता है कि -l ध्वज दिया जाना चाहिए -rpath का उपयोग करते समय उदाहरण के लिए:

gcc -o test test.o -L. -lmylib -Wl,-rpath=.

एल-एल ध्वज की आवश्यकता क्यों है? संकलन के समय में एच-फाइलों की जानकारी से अधिक जानकारी की आवश्यकता क्या है?

अगर मैं-एल हटाता हूं मुझे निम्न संदेश मिलता है:

gcc -o test test.o -lmylib -Wl,-rpath=.
/usr/bin/ld: cannot find -lmyLib

हालांकि दोनों ध्वजों को हटाने के लिए बिल्कुल ठीक है। इस कदर:

gcc -o test test.o -lmylib

बशर्ते libmyLib / usr / lib में पाया जा सकता है, वह है। क्यों नहीं अब एल की आवश्यकता है?

यह https://stackoverflow.com/a/8482308/1091780 पर एक अनुवर्ती प्रश्न है


ओमगटेची के उत्तर का स्पष्टीकरण।

अगर लिंकर यह नहीं देखता कि कौन सा प्रतीकों पुस्तकालय द्वारा उपलब्ध कराई गई हैं, तो यह कभी भी आपको बता नहीं सकता है कि संकलन के समय में कोई भी प्रतीक अनुपलब्ध है। वे रन-टाइम में लोड किए गए एक पुस्तकालय में हो सकते हैं आप कभी नहीं जानते थे लाइब्रेरी की हैडर फाइल और .so फ़ाइल के बीच समय संकलन में कोई कनेक्शन नहीं है


यहां तक ​​कि गतिशील पुस्तकालयों को स्थिर लिंक की एक डिग्री की आवश्यकता होती है; लिंकर को पता होना चाहिए कि डायनामिक लाइब्रेरी द्वारा कौन-से प्रतीकों की आपूर्ति की जानी चाहिए। महत्वपूर्ण अंतर यह है कि गतिशील पुस्तकालय रनटाइम पर परिभाषा प्रदान करता है, जबकि पूरी तरह से स्थैतिक पुस्तकालय लिंक अवधि पर परिभाषा प्रदान करता है।

इस कारण से, -L को निर्दिष्ट करना आवश्यक है कि फाइल को कैसे लिंक करना है, -L विशिष्ट पुस्तकालय को निर्दिष्ट करता है। इस वर्तमान निर्देशिका को इंगित करता है

-rpath रनटाइम पर खेलने में आता है, जब एप्लिकेशन गतिशील पुस्तकालय को लोड करने की कोशिश करता है। यह एक गतिशील पुस्तकालय को लोड करने का प्रयास करते समय खोज करने के लिए एक अतिरिक्त स्थान के कार्यक्रम को सूचित करता है।

कारण- -L/usr/lib को निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि लिंकर वहां डिफ़ॉल्ट रूप से देख रहा है (क्योंकि यह पुस्तकालयों को रखने के लिए एक बहुत ही आम जगह है)





shared-libraries