2011-01-30 36 views
25

शीर्षक ज्यादातर इसे कवर करता है, मॉड्यूल और साझा लाइब्रेरी के बीच क्या अंतर है?मॉड्यूल और साझा पुस्तकालयों के बीच अंतर?

साझा पुस्तकालयों गतिशील जुड़ा हुआ है और रनटाइम पर लोड किए गए हैं: मैं बस CMake के add_library आदेश में इस तरह के अंतर, वे कहाँ का कहना है कि मिल गया। मॉड्यूल लाइब्रेरी प्लगइन हैं जो अन्य लक्ष्यों से जुड़े नहीं हैं लेकिन डोलोपेन जैसी कार्यक्षमता का उपयोग करके रनटाइम पर गतिशील रूप से लोड हो सकते हैं।

लेकिन मैं dlopen() का उपयोग करके एक साझा ऑब्जेक्ट लोड कर सकता हूं, है ना?

उत्तर

22

अंतर यह है कि आप लिंकर के साथ एक साझा पुस्तकालय से लिंक कर सकते हैं, लेकिन आप लिंकर के साथ मॉड्यूल से लिंक नहीं कर सकते हैं। पर प्लेटफॉर्म पर।

तो ... पूरी तरह से पार मंच हो सकता है और हर जगह CMake काम करता है काम करने के लिए, तो आप इस कभी नहीं करना चाहिए: तो यह

# This is a big NO-NO: 
add_library(mylib MODULE ${srcs}) 
target_link_libraries(myexe mylib) 

निष्पक्ष बनाने के लिए विंडोज पर, वे दोनों सिर्फ DLLs कर रहे हैं, और कोड वास्तव में काम कर सकता है। लेकिन जब आप इसे ऐसे मंच पर ले जाते हैं जहां मॉड्यूल से लिंक करना असंभव है, तो आपको एक त्रुटि मिल जाएगी।

नीचे पंक्ति: यदि आपको लाइब्रेरी से लिंक करने की आवश्यकता है, तो SHARED का उपयोग करें। यदि आपको गारंटी है कि पुस्तकालय केवल गतिशील रूप से लोड किया जाएगा, तो मॉड्यूल का उपयोग करना सुरक्षित है। (और शायद यह भी बेहतर मदद करने के लिए पता लगाने यदि किसी करता है इसे करने के लिए लिंक करने के लिए कोशिश ...)

+0

क्या किसी को पता है कि यह कौन सा प्लेटफॉर्म यह मुद्दा हो सकता है? – mhsmith

5

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

1

एक और अंतर यह कैसे ..._OUTPUT_DIRECTORY और ..._OUTPUT_NAME नियंत्रित किया जाता है में है:

मॉड्यूल पुस्तकालयों हमेशा पुस्तकालय के रूप में इलाज कर रहे हैं लक्षित करता है। गैर-डीएलएल प्लेटफार्मों के लिए साझा पुस्तकालयों को लाइब्रेरी लक्ष्यों के रूप में माना जाता है। डीएलएल प्लेटफ़ॉर्म के लिए साझा लाइब्रेरी के डीएलएल भाग को रनटाइम लक्ष्य के रूप में माना जाता है और संबंधित आयात लाइब्रेरी को संग्रह लक्ष्य के रूप में माना जाता है। सिगविन समेत सभी विंडोज-आधारित सिस्टम डीएलएल प्लेटफार्म हैं।

उदाहरण के लिए, इसका मतलब है कि यदि आप Windows पर एक SHARED पुस्तकालय संकलन, LIBRARY_OUTPUT_DIRECTORY नजरअंदाज कर दिया जाएगा, क्योंकि यह ARCHIVE_OUTPUT_DIRECTORY और RUNTIME_OUTPUT_DIRECTORY पर बजाय रही है।

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