2011-11-16 25 views
6

मेरा सी ++ कंपाइलर "डाइलिब" फाइल बनाता है जिसमें गतिशील पुस्तकालय होते हैं। .dylib और .so फ़ाइलों के बीच क्या अंतर है?dylib फ़ाइलों का क्या अर्थ है?

और ईएलएफ प्रारूप में मैक-ओ प्रारूप और फ़ाइलों में फ़ाइलों के बीच क्या अंतर है? मुझे आईओएस (स्थिर पुस्तकालय केवल/मैक-ओ) और एंड्रॉइड (ईएलएफ) के तहत बाद में उपयोग के लिए फाइलें बनाना है।

Thanx!

उत्तर

4

मैंने पाया कि:

एक मच-ओ विशेषता यह है कि आश्चर्य की बात से बहुत से लोगों को हिट साझा पुस्तकालयों और गतिशील रूप से लोड करने योग्य मॉड्यूल के बीच सख्त अंतर है। ईएलएफ सिस्टम पर दोनों समान हैं; साझा कोड का कोई भी टुकड़ा लाइब्रेरी के रूप में और गतिशील लोडिंग के लिए उपयोग किया जा सकता है। को कुछ_फाइल की फ़ाइल प्रकार देखने के लिए otool -hv some_file का उपयोग करें।

मैक-ओ साझा पुस्तकालयों में फ़ाइल प्रकार MH_DYLIB है और एक्सटेंशन .dylib ले जाएं। उन्हें सामान्य स्थिर लिंकर झंडे के साथ जोड़ा जा सकता है, उदा। libfoo.dylib के लिए -lfoo। हालांकि, वे मॉड्यूल के रूप में लोड नहीं हो सकते हैं। (साइड नोट: साझा लाइब्रेरी को एपीआई के माध्यम से गतिशील रूप से लोड किया जा सकता है। हालांकि, वह एपीआई बंडलों के लिए एपीआई से अलग है और सेमेन्टिक्स इसे एक डलोपेन() इम्यूलेशन के लिए बेकार बनाते हैं। सबसे विशेष रूप से, साझा पुस्तकालयों को अनलोड नहीं किया जा सकता ।) [यह अब सत्य नहीं है - आप dlopen() दोनों dylibs और बंडलों के साथ उपयोग कर सकते हैं। हालांकि, dylibs को अभी भी अनलोड नहीं किया जा सकता है।]

लोड करने योग्य मॉड्यूल को मैक-ओ बोलने में "बंडल" कहा जाता है। उनके पास फ़ाइल प्रकार MH_BUNDLE है। चूंकि इसमें कोई भी घटक शामिल नहीं है, इसलिए कोई एक्सटेंशन ले सकता है। विस्तार। बंडल की सिफारिश ऐप्पल द्वारा की जाती है, लेकिन अधिकांश पोर्टेड सॉफ़्टवेयर संगतता के लिए .so का उपयोग करता है। बंडलों को डायल एपीआई के माध्यम से गतिशील रूप से लोड और अनलोड किया जा सकता है, और वहां एक रैपर है जो एपीआई के शीर्ष पर dlopen() को emulates करता है। [dlopen अब पसंदीदा एपीआई है।] बंडलों के खिलाफ को लिंक करना संभव नहीं है जैसे कि वे पुस्तकालयों को साझा करते थे। हालांकि, यह संभव है कि एक वास्तविक बंडल वास्तविक साझा पुस्तकालयों के खिलाफ जुड़ा हुआ है; बंडल लोड होने पर स्वचालित रूप से लोड हो जाएंगे।

ओएस एक्स पर एक सामान्य साझा लाइब्रेरी संकलित करने के लिए, आपको -dynamiclib और एक्सटेंशन .dylib का उपयोग करना चाहिए। -एफपीआईसी डिफ़ॉल्ट है।