2011-09-22 13 views
5

मैं एसएफएमएल के साथ काम कर रहा था, मैंने थोड़ा परीक्षण कार्यक्रम संकलित किया और लिंक विकल्प -lsfml-audio जोड़ा। फिर, मैंने ldd ./program का उपयोग किया जो गतिशील पुस्तकालयों को जोड़ने के लिए था। हैरानी की बात है कि, उनमें से कोई भी मैन्युअल रूप से मेरे मेकफ़ाइल में नहीं चुना गया था, न ही pkg-config --libs का उपयोग कर रहा था।साझा लाइब्रेरी की निर्भरता लिंकिंग

मैंने साझा पुस्तकालयों के बारे में पढ़ना शुरू किया, और मेरे संदेहों को हल करने के लिए एक छोटा सा उदाहरण बनाया। हालांकि, मैं इस सवाल है:

क्यों कुछ पुस्तकालयों आप अपने makefile में निर्भरता जोड़ने की जरूरत है (या तो स्वयं या pkg-config की तरह एक स्क्रिप्ट का उपयोग) और अन्य पुस्तकालयों स्वचालित रूप से उनकी निर्भरता लिंक?

आप अपना डायनामिक पुस्तकालय बनाते समय, सिर्फ g++ -shared ... आदेश में उचित -ldependency विकल्पों को जोड़ने उपयोगकर्ता मैन्युअल रूप से बाद में निर्भरता को जोड़ने की परेशानी से बचने के लिए के रूप में के रूप में आसान है। उपलब्ध पुस्तकालयों में से कई ऐसा क्यों नहीं करते हैं?

मुझे लगता है कि यह ठीक ट्यूनिंग की क्षमता से संबंधित होना चाहिए जो पुस्तकालयों से जुड़ा हुआ है और ऐसा।

उत्तर

6

साझा पुस्तकालय आम तौर पर उनकी निर्भरताओं में लिंक होंगे। हालांकि, स्थिर पुस्तकालय ऐसा करने में सक्षम नहीं हैं। pkg-config --libs में अक्सर सभी निर्भरताएं (प्रत्यक्ष और अप्रत्यक्ष) शामिल होती हैं ताकि आप अतिरिक्त लाइब्रेरी निर्भरताओं को जोड़ने के बिना -static जोड़कर स्थैतिक संकलन पर भी स्विच कर सकें।

ध्यान दें कि कुछ अतिरिक्त मामलों में इन अतिरिक्त प्रत्यक्ष निर्भरताओं को अवांछित माना जाता है (उदाहरण के लिए, डेबियन पैकेज किए गए बाइनरी में उनसे बचने की कोशिश करता है, क्योंकि वे पुस्तकालय soname संक्रमण आवश्यक से अधिक दर्दनाक बनाते हैं)। आप लिंकर को अंतिम निष्पादन योग्य से प्रत्यक्ष निर्भरताओं को पट्टी करने के निर्देश दे सकते हैं जिन्हें -Wl,--as-needed ध्वज के साथ आवश्यक नहीं है।

+0

मुझे लगता है कि मुझे यहां कुछ नाम-कॉल करने की आवश्यकता है: साझा पुस्तकालय आमतौर पर उनकी निर्भरताओं में नहीं खींचते हैं (यह 'libtool' है जब यह '* .la' फ़ाइल देखता है)। उन्हें इसे शामिल करने की आवश्यकता नहीं है क्योंकि गतिशील लोडर उन्हें साझा पुस्तकालयों में '.NEEDED' शीर्षलेख से बाहर निकाल देगा। ओवरलिंकिंग मुद्दों के अलावा 'libtool' परिचय देता है, लिंक समय पर प्रतीकों की परिभाषाओं को देखने के लिए भी बहुत कुछ धीमा कर सकते हैं। –

+0

@ होंक, हां, libtool इन समस्याओं का एक स्रोत है। हालांकि, पीकेजी-कॉन्फ़िगर स्क्रिप्ट भी ऐसा कर सकती हैं। किसी भी मामले में, वे निश्चित रूप से ईएलएफ प्लेटफ़ॉर्म पर आवश्यक नहीं हैं - आपको केवल उस चीज़ को लिंक करना होगा जो आप सीधे उपयोग करते हैं (हालांकि इसमें इनलाइन फ़ंक्शंस या मैक्रोज़ के माध्यम से उपयोग की जाने वाली कुछ भी शामिल है) – bdonlan

संबंधित मुद्दे