2011-12-23 18 views
11

से बुलाया गया है मेरे पास सी ++ में एक साझा लाइब्रेरी है। यह extern "C" कार्यों से बना एक दृश्य इंटरफ़ेस निर्यात करता है जो अपारदर्शी प्रकारों को बना, नष्ट और कुशलतापूर्वक उपयोग करता है।सी ++ साझा लाइब्रेरी सी

अब, मैं एक शुद्ध सी प्रोग्राम चाहता हूं जो इस पुस्तकालय का उपयोग करता है।

क्या मैं यह (मंच स्वतंत्र रूप से) कर सकता हूं?सी ++ में नहीं लिखा गया है जब सी ++ रनटाइम और सी ++ स्थैतिक ऑब्जेक्ट्स प्रारंभ हो जाएंगे?

उत्तर

5

प्रारंभिक चरण मंच निर्भर है। लिनक्स के मामले में, गतिशील रूप से लोड की गई लाइब्रेरी विशेष रूप से घोषित प्रतीकों को प्राप्त कर सकती हैं जिन्हें लाइब्रेरी लोड होने पर स्वचालित रूप से dlopen() द्वारा बुलाया जाता है।

dlopen(3), सेक्शन के लिए मैनपेज देखें, अधिक जानकारी के लिए अप्रचलित प्रतीकों init() और fini()

स्टेटिक प्रारंभकर्ताओं को स्पष्ट रूप से __attribute__((constructor)) के रूप में चिह्नित किया गया है, इसलिए सामान्य रूप से आपको साझा लाइब्रेरी लोड होने पर उन्हें कॉल करने के लिए कुछ खास करने की ज़रूरत नहीं है। मुझे संदेह है कि यह अन्य प्लेटफॉर्म पर समान या समान है।

+0

परिशिष्ट। (glibc :) init/fini रनटाइम पर्यावरण (crtS.o) द्वारा प्रदान किया जाता है और स्थिर अवधि ऑब्जेक्ट्स के आरंभ करने और __attribute __ ((कन्स्ट्रक्टर) चिह्नित कॉलिंग फ़ंक्शंस के लिए उपयोग किया जाता है, इसलिए अपने आप में इनिट/फिनि ओवरराइड करने से समस्याएं हो सकती हैं , एक डबल प्रतीक परिभाषा के कारण बाहर निकलने सहित। –

+0

@ जर्जेन्सन: क्या यही कारण है कि उन्हें बहिष्कृत किया गया है? – onitake

4

क्या मैं यह (मंच स्वतंत्र रूप से) कर सकता हूं?

लाइब्रेरी लोडिंग एक प्लेटफार्म निर्भर संचालन है।

जब सी ++ क्रम और सी ++ स्थिर वस्तुओं प्रारंभ हो जाएगी, तो मुख्य सी ++ में नहीं लिखा है?

कोई फर्क नहीं पड़ता। मुख्य प्रवेश करने से पहले उन्हें आरंभ किया जाएगा।

+1

ठीक है, 'मुख्य' दर्ज होने के बाद भी लाइब्रेरी लोड हो सकती है (मैन्युअल रूप से)। और "मुख्य प्रवेश करने से पहले उन्हें प्रारंभ किया जाएगा।" एक गलतफहमी है। यह क्रियान्वयन-परिभाषित किया गया है कि क्या स्थिर वस्तु का प्रारंभिकरण 'मुख्य' दर्ज करने से पहले होता है, या इसके पहले उपयोग से पहले कभी भी होता है। लेकिन सभी व्यावहारिक उद्देश्यों के लिए, हाँ, वे 'मुख्य' से पहले शुरू होते हैं, या लाइब्रेरी लोड होने के ठीक बाद। – jweyrich

1

आमतौर पर, साझा लाइब्रेरी सिस्टम में स्वयं का एक प्रवेश बिंदु होता है जिसमें यह काम करने के लिए main नहीं है लेकिन डीएलएल के पास DLLMain है जहां कार्यान्वयन इस तरह का कोड डाल सकता है। हालांकि, सामान्य मामले में, यह आपका कोई भी व्यवसाय नहीं है और यह इस मुद्दे से निपटने के लिए उपयोग किए जाने वाले किसी भी कंपाइलर का काम है।

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