2010-12-10 14 views
6

पर साझा लाइब्रेरीज़ के बारे में दुविधा, यदि मैं एक साझा लाइब्रेरी (साझा ऑब्जेक्ट) बनाता हूं तो मैं इसे दो तरीकों से उपयोग कर सकता हूं:
साझा लाइब्रेरी का उपयोग करने का पहला तरीका है जैसे कि मैं एक स्थिर लाइब्रेरी का उपयोग करूंगा।यूनिक्स

  #include "myLib.h" 
      //... 
      //afterwards I can use functions defined in mylib.h 
      myFunction(); 

साझा लाइब्रेरी का उपयोग करने का दूसरा तरीका गतिशील लोडर एपीआई कार्यों को फोन करके यह है: dlopen, dlsym, और dlclosedlfcn.h से। उदाहरण के लिए, मैं प्लगइन पैटर्न को कार्यान्वित करना चाहता हूं, इस तरह से साझा लाइब्रेरी का उपयोग इस तरह से करता हूं। लिस्टिंग इस प्रकार दिखाई देगा:

#include <dlfcn.h> 

void *myLib;    /* Handle to shared lib file */ 
void (*myFunction)();  /* Pointer to loaded function */ 

    //... 

    //load shared object 
    myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY); 
    dlerror(); 

    //get handle to function 
    myFunction = dlsym(myLib, "myFunction"); 
    dlerror(); 

    //execute function 
    (*myFunction)(); 

    //close lib 
    dlclose(myLib); 
    dlerror(); 

अब मेरी पहला सवाल है: समय लोड हो रहा है के संदर्भ में साझा वस्तु के इन दो प्रयोगों के बीच क्या अंतर है? पहली बार साझा लाइब्रेरी का उपयोग करके, हम लोड लाइब्रेरी में मुख्य ऐप में साझा लाइब्रेरी को लिंक/लोड कर रहे हैं और दूसरी तरफ हम रन-टाइम में एक ही काम कर रहे हैं?

दूसरा प्रश्न। इन दो उपयोगों का नाम क्या है? पहले व्यक्ति को स्थाई रूप से जुड़े साझा लाइब्रेरी कहा जाता है और दूसरा एक गतिशील रूप से साझा/साझा लाइब्रेरी लोड किया जाता है?

तीसरा सवाल मैं -fPIC ध्वज (osition स्वतंत्र कोड) बिना किसी साझा लाइब्रेरी का निर्माण किया है, तो मैं एक दूसरे तरीके से उपयोग करने में सक्षम हो सकता है?

चीयर्स

उत्तर

4

इन दो उपयोग मोड आमतौर पर अंतर्निहित और स्पष्ट कहा जाता है। जैसा कि आपने सही ढंग से कहा है कि लोडिंग में अंतर यह है कि स्पष्ट रूप से जुड़े गतिशील लाइब्रेरी को लोड किया जाता है जब डलोपेन निष्पादित किया जाता है और एप्लिकेशन को स्मृति में लोड होने पर अंतर्निहित लिंक लाइब्रेरी लोड की जाती है। प्रत्येक डलोपेन समाप्त होने के लिए मिलीसेकंड ले सकता है, जब तक लाइब्रेरी पहले से लोड नहीं हो जाती है, इस मामले में यह बहुत तेज है, इसलिए यदि आपके पास बहुत कठोर विलंबता आवश्यकताएं हैं या लगातार लोडिंग/अनलोडिंग करने की आवश्यकता है तो आप लाइब्रेरी को स्पष्ट या स्पष्ट रूप से लोड करने का निर्णय ले सकते हैं कार्यक्रम शुरू होने तक इसे तब तक अनलोड न करें जब तक इसका उपयोग नहीं किया जाता है।

+0

यदि मैं साझा लाइब्रेरी बदलता हूं और इसे पुन: संकलित करता हूं, तो क्या मुझे उन सभी मुख्य अनुप्रयोगों को फिर से जोड़ना होगा जो साझा किए गए lib का उपयोग करते हैं यदि मैं निहित लिंकिंग का उपयोग कर रहा हूं या यह एप्लिकेशन लोड होने पर स्वचालित रूप से किया जाता है? –

5

मुख्य अंतर त्रुटि प्रबंधन में है। लागू करना आसान है, लेकिन यदि कोई समस्या है (लाइब्रेरी गुम है या फ़ंक्शन लाइब्रेरी में नहीं है) तो प्रोग्राम बिल्कुल भी विफल हो जाएगा। स्पष्ट लोडिंग के साथ, आप त्रुटियों के लिए dlopen/dlsym कॉल की जांच कर सकते हैं और यदि कोई समस्या है, तो कुछ विकल्प पर वापस आना।

अपने तीसरे सवाल का जवाब करने के लिए, यह वास्तव में वास्तुकला पर निर्भर करता है, लेकिन सबसे Abis पर आप अभी भी -PIC बिना संकलित एक साझा वस्तु लोड कर सकते हैं, लेकिन यह लोड करने में धीमा हो सकता है और अधिक स्मृति की आवश्यकता हो सकती।

+0

यदि मैं एक साझा लाइब्रेरी बदलता हूं और इसे पुन: संकलित करता हूं, तो क्या मुझे उन सभी मुख्य अनुप्रयोगों को फिर से जोड़ना होगा जो उस साझा lib का उपयोग करते हैं यदि मैं निहित लिंकिंग का उपयोग कर रहा हूं या यह एप्लिकेशन लोड होने पर स्वचालित रूप से किया जाता है? –

+0

@ कोबाक: नहीं - साझा पुस्तकालय हमेशा लोड होने पर जुड़े होते हैं, या तो जब एप्लिकेशन शुरू होता है, या जब डलोपेन कहा जाता है –