पर साझा लाइब्रेरीज़ के बारे में दुविधा, यदि मैं एक साझा लाइब्रेरी (साझा ऑब्जेक्ट) बनाता हूं तो मैं इसे दो तरीकों से उपयोग कर सकता हूं:
साझा लाइब्रेरी का उपयोग करने का पहला तरीका है जैसे कि मैं एक स्थिर लाइब्रेरी का उपयोग करूंगा।यूनिक्स
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
साझा लाइब्रेरी का उपयोग करने का दूसरा तरीका गतिशील लोडर एपीआई कार्यों को फोन करके यह है: dlopen
, dlsym
, और dlclose
dlfcn.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 स्वतंत्र कोड) बिना किसी साझा लाइब्रेरी का निर्माण किया है, तो मैं एक दूसरे तरीके से उपयोग करने में सक्षम हो सकता है?
चीयर्स
यदि मैं साझा लाइब्रेरी बदलता हूं और इसे पुन: संकलित करता हूं, तो क्या मुझे उन सभी मुख्य अनुप्रयोगों को फिर से जोड़ना होगा जो साझा किए गए lib का उपयोग करते हैं यदि मैं निहित लिंकिंग का उपयोग कर रहा हूं या यह एप्लिकेशन लोड होने पर स्वचालित रूप से किया जाता है? –