2011-07-03 11 views
12

मुझे हाल ही में उबंटू सिस्टम पर कुछ मामूली प्रोग्रामिंग करना पड़ा है (जिस पर मैं बेहद निम्न स्तर का शुरुआती हूं) और मैं वास्तव में मेकफ़ाइल से परिचित हूं।लिनक्स में स्थिर पुस्तकालयों के लिए lib {library name} .a/.so नामकरण सम्मेलन है?

मैंने देखा कि लिंकर को यह बताने के लिए तर्क कि पुस्तकालयों को हमेशा शामिल किया गया था- पुस्तकालय नाम} जहां संबंधित लाइब्रेरी/usr/lib फ़ोल्डर में "lib {library name} .a" नामक कुछ होगी।

मुझे आश्चर्य है: क्या यह एक सम्मेलन है? मैंने सोचा होगा कि मुझे libNAME.a नामक लाइब्रेरी खोजने के लिए -llibNAME टाइप करना होगा, लेकिन ऐसा लगता है कि यह एक lib उपसर्ग है।

क्या यह हमेशा ऐसा होता है? क्या मैं lib libff का उपयोग किए बिना लाइब्रेरी का नाम दे सकता हूं?

+2

उत्तर नहीं है। स्थिर पुस्तकालयों के लिए नामकरण सम्मेलन 'lib {name} .a' है। –

+2

... जबकि '.so' फ़ाइलें * साझा * पुस्तकालय हैं। – BoltClock

+0

ओह, बेवकूफ गलती! धन्यवाद! – 8bitcartridge

उत्तर

17

आप किसी भी तरह से आप चाहते हैं एक नाम दे सकते हैं, लेकिन ld के -l संभालने एक lib उपसर्ग दोनों स्थिर और साझा पुस्तकालयों के लिए लागू होता है और वापस एक लंबा रास्ता चला जाता है, lib उपसर्ग के बिना आपको इसका उपयोग स्पष्ट रूप से करने की आवश्यकता होगी।

यह वास्तव में आधुनिक सिस्टम पर भी उपयोगी है: एक नाम libfoo.so को लिंक-टाइम लाइब्रेरी के रूप में पहचाना जा सकता है, जबकि foo.so रनटाइम प्लगइन को लागू करने वाली साझा ऑब्जेक्ट को इंगित करता है। या विशेष उपप्रणाली के लिए प्लगइन की पहचान करने के लिए lib के स्थान पर उपप्रणाली-विशिष्ट उपसर्ग; उदाहरण के लिए देखें pam_*.so और nss_*.so

3

संक्षिप्त उत्तर, हाँ यह सम्मेलन है।

g ++ 's -l विकल्प lib {somename} के लिए जांच करेगा। इसलिए आपके lib और स्थानीय पथ में।

हालांकि यूनिक्स में, आप प्रतीकात्मक लिंक का भी उपयोग कर सकते हैं, ताकि आपके पुस्तकालयों के विभिन्न संस्करण हो सकें, आपकी मेकअप स्क्रिप्ट को संशोधित किए बिना।

संपादित करें जोड़ने के लिए:

के रूप में कोई टिप्पणी में बताया, .a एक स्थिर पुस्तकालय के लिए विस्तार है, जबकि .so एक साझा लाइब्रेरी है।

3

असल में, कोई। मेरा मतलब है, लगभग! आप स्थिरसाझा पुस्तकालयों के साथ मिश्रित कर रहे हैं। स्टेटिक लाइब्रेरी .a फाइलें हैं, और साझा पुस्तकालय .so के साथ समाप्त होते हैं।

संक्षेप में, आप साझा पुस्तकालयों के बारे में बात कर रहे हैं, ठीक है? जब साझा libs के साथ अपने आवेदन को जोड़ने, आप मानक सम्मेलन जो -lNAME है, जहां नामlibNAME.so को

11

name.a एक स्थिर पुस्तकालय (a क्योंकि यह वस्तुओं का एक संग्रह है) है अंतर्गत आता है उपयोग करने के लिए की जरूरत है।

name.so गतिशील लाइब्रेरी (so है क्योंकि यह एक साझा वस्तु है, जिसे कभी-कभी डीएसओ के रूप में भी जाना जाता है, डायनामिक साझा ऑब्जेक्ट के लिए)।

-lfoo लिंकर स्विच परंपरागत रूप से libfoo.{so,a} फॉर्म का नाम मानता है, और लाइब्रेरी पथ पर इसकी खोज करता है।आप लिंकर को सीधे लाइब्रेरी नाम भी पास कर सकते हैं (-l स्विच का उपयोग किए बिना), लेकिन उस स्थिति में आपको पुस्तकालय के लिए पथ को स्पष्ट रूप से पास करना होगा।

@geekosaur जैसा कि आपने रनटाइम पर साझा ऑब्जेक्ट खोल दिया है, dlopen() पूर्ण फ़ाइल नाम लेता है।

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