मैंने स्थैतिक पुस्तकालय के हिस्से के रूप में एक बहुत ही बुनियादी "प्लग-इन सिस्टम" लागू किया है। प्रत्येक "प्लग-इन" एक विशिष्ट छवि प्रारूप के लिए समर्थन लागू करता है, उदा। जीआईएफ, जेपीईजी, आदि .. इसके अलावा, मेरे पास सिंगलटन (PluginManager
नामक एक वर्ग) है जो सभी उपलब्ध प्लग-इन की एक सूची रखता है।स्टेटिक लाइब्रेरी में ऑब्जेक्ट पंजीकरण
मुश्किल हिस्सा यह है कि मैं प्रोजेक्ट फ़ाइल से अपनी स्रोत फ़ाइलों को जोड़कर या हटाकर प्लग-इन को अक्षम/सक्षम करना चाहता हूं। इसे प्राप्त करने के लिए, प्रत्येक प्लग-इन एक वैश्विक चर (विभिन्न नामों के साथ) बनाता है और उस वर्ग के निर्माता में प्लग-इन को PluginManager
पर पंजीकृत करता है।
कुछ JPEG प्रारूप के लिए इस तरह ...
struct JPEGPlugin
{
// constructor will register plugin
JPEGPlugin()
{
PluginManager::Singleton().RegisterPlugin(this);
}
// plenty of other code
...
};
JPEGPlugin jpeg_instance; // instantiate in global scope
हालांकि, जबकि इस सिद्धांत में पूरी तरह से काम करता है, यह विफल रहता है, जब अन्य कोड को यह स्थिर पुस्तकालय को जोड़ने एक निष्पादन योग्य बनाने के लिए। जब तक यह निष्पादन योग्य प्लगइन ग्लोबल्स (जैसे jpeg_instance
) तक नहीं पहुंचता है, तो लिंकर को कनेक्शन नहीं दिखाई देता है (वह पूरी तरह से निर्माता के दुष्प्रभावों को अनदेखा करता है) और अंतिम निष्पादन योग्य में कोड शामिल नहीं करता है। दूसरे शब्दों में, जेपीईजी प्लग-इन अंतिम ऐप में उपलब्ध नहीं है।
मैं पिछले कुछ वर्षों में समस्याओं में भाग गया, और मैंने हमेशा समाधान के लिए नेट की खोज की। हर बार, मुझे बस ऐसे पृष्ठ मिलते हैं जो मूल रूप से कहते हैं कि यह एक ज्ञात समस्या है और मुझे इसके साथ रहना है।
लेकिन शायद एसओ पर कोई जानता है कि यह कैसे काम कर रहा है?
ठीक है, मैंने अभी आपका संपादन देखा - यह एक बड़ा मुद्दा है! :) –