2011-01-22 16 views
22

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

यह तब तक काम करता है जब तक साझा लाइब्रेरी का उपयोग नहीं किया जाता है। जब स्थिर संस्करण का उपयोग किया जाता है, तो किसी भी स्थिर वस्तु को अंतिम कार्यक्रम में शामिल नहीं किया जाता है (क्योंकि उन्हें सीधे संदर्भित नहीं किया जाता है) और इस प्रकार उनकी कार्यक्षमता उपलब्ध नहीं है।

क्या लिंकिंग करते समय लाइब्रेरी से सभी स्थैतिक वस्तुओं को शामिल करने के लिए जीसीसी को मजबूर करने का कोई तरीका है?

लाइब्रेरी ओपन सोर्स है और यदि यह मदद करता है, तो मैं इसे संशोधित कर सकता हूं।

उत्तर

22

आप -Wl,--whole-archive -lyourlib का उपयोग कर सकते हैं, अधिक जानकारी के लिए ld के लिए मैनपेज देखें।

-ब्लूएल के बाद उल्लिखित किसी भी स्थिर पुस्तकालय, - कमांड लाइन पर पूरा संग्रह पूरी तरह से शामिल हो जाता है, यदि आपको आवश्यकता हो तो आप इसे फिर से बंद कर सकते हैं, उदाहरण के लिए -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl, - पूरे संग्रह में कई प्रतीकों को शामिल करने का कारण बनता है जो पहले से ही अन्य पुस्तकालयों या कुछ हल किए जा सकते हैं जिन्हें हल नहीं किया जा सकता है। क्या सांख्यिकी को शामिल करने के लिए एक और बढ़िया तरीका है? –

+0

यह समझ में नहीं आता जीन: यह साझा लाइब्रेरी लोड करने जैसा ही है: आपको पूरी लाइब्रेरी मिलती है, और कुछ भी नहीं। माना जाता है कि बाहरी संदर्भों को खोजने के लिए एलडी की खराब धारणा है, इसलिए आपको चीजों का सही अधिकार प्राप्त करने की आवश्यकता है। – Yttrill

+7

'-ब्लूएल, - नो-ऑल-आर्काइव' के साथ व्यवहार को बंद करना वास्तव में वैकल्पिक नहीं है, भले ही आपके पास शामिल करने के लिए कोई और पुस्तकालय न हो। जीसीसी आपके कमांड के अंत में सभी मानक सिस्टम लाइब्रेरी जोड़ देगा, इसलिए यदि आप '- व्हाहोल-आर्काइव' छोड़ देते हैं तो वे सभी इससे प्रभावित होंगे और इससे डुप्लिकेट प्रतीक समस्या @GeneVincent ने –

1

एक प्रकार की हैक ने मेरी मदद की। हालांकि अभी भी हेडर शामिल करना होगा।

// in the header with your class 
struct RegistrationHelper { 
    RegistrationHelper(); 
}; 

static RegistrationHelper Helper; 

// in your cpp where you register your class 
RegistrationHelper::RegistrationHelper() {} 
+0

लेकिन यह मानता है कि आपके पास '.cpp' लेखक का सहयोग है, जिसे अब स्थिर पुस्तकालय में प्रत्येक पंजीकरण-सहायक वस्तु के बारे में पता होना चाहिए। – einpoklum

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

  • कोई संबंधित समस्या नहीं^_^