यहां स्थिति है, मुझे एक सी ++ कोडबेस मिला है जो हाल ही में जीसीसी (4.3.3) का उपयोग कर रहा है, लेकिन मुझे जीसीसी 3.2 का उपयोग करके बनाई गई एक पुरानी लाइब्रेरी के खिलाफ लिंक करने की आवश्यकता है। 3। लाइब्रेरी का कोई नया संस्करण उपलब्ध नहीं है, मैं इसके बिना नहीं जा सकता, और यह बंद स्रोत है इसलिए इसे पुनर्निर्मित नहीं किया जा सकता है।विरासत पुस्तकालयों के खिलाफ निर्माण करने के लिए सी ++ एबीआई मिश्रण
ऐसा लगता है कि जीसीसी 4.3.3 और 3.2.3 के बीच एबीआई असंगतताएं हैं, इसलिए मैं यह देखने की कोशिश कर रहा हूं कि इसका समाधान करने के लिए मेरे विकल्प क्या हैं।
कुछ अतिरिक्त विवरण:
- मैं सही ABI संस्करण प्राप्त करने के -fabi-संस्करण = 1 के साथ अपने codebase में सब कुछ के पुनर्निर्माण कर सकते हैं, लेकिन मैं libstdc से कुछ नई सुविधाओं पर निर्भर कर रहा हूँ ++ संस्करण 6.
- कोडबेस के बाहर सभी सी ++ लाइब्रेरी निर्भरता ओपन सोर्स हैं, इसलिए मैं इसे एक पुस्तकालय को छोड़कर, आवश्यकतानुसार पुनर्निर्माण कर सकता हूं।
- कई सी लाइब्रेरी निर्भरता जिन्हें पुनर्निर्माण नहीं किया जा सकता है या पुनर्निर्माण करना मुश्किल होगा।
- -fabi-संस्करण = 1 और लिंक के साथ सभी सी ++ कोड और निर्भर पुस्तकालयों के पुनर्निर्माण:
- पुराने पुस्तकालय 5 सुविधाओं
मैं अब तक की कोशिश की है कुछ libstdC++ संस्करण पर निर्भर हो रहा है libstdC++ संस्करण 6 के खिलाफ। यह C++ मानक लाइब्रेरी प्रतीकों के लिए अपरिभाषित प्रतीक त्रुटियों के कुछ हद तक विफल रहता है।
- उपरोक्त के समान लेकिन libstdC++ 5 के लिए साझा लाइब्रेरी में अतिरिक्त लिंक, यह लिंकर समस्याओं को हल करता है लेकिन परिणामस्वरूप विरासत पुस्तकालय के अंदर रनटाइम पर दो संस्करणों का मिश्रण होता है, और इससे क्रैश होता है। जो संकेत मिलता है कि यह एक आवेदन में सी ++ ABI संस्करणों मिश्रण करने पुस्तकालयों के बीच अलग-अलग निर्भरता को पूरा करने के लिए संभव हो सकता है लगता है http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html:
मैं इस पेज को पढ़ें। यह यहां बहुत अच्छी तरह से काम नहीं कर रहा है, हालांकि, जब तक कि मुझे कुछ याद नहीं आ रहा है।
कोई विचार?
लिंकर विकल्प '-स्सिम्बोलिक' और '- एक्सक्लूस-लिब्स' आपको मदद कर सकते हैं यदि आप पुरानी libstdC++ को एक साझा लाइब्रेरी में स्थिर रूप से लिंक करते हैं। –