वह ब्लॉग पोस्ट बहुत गलत है।
जहां तक मुझे पता है कि C ++ ABI में बदलाव GCC की हर बड़ी रिलीज के साथ किए गए हैं (यानी अलग-अलग या दूसरे वर्जन नंबर वाले कंपोनेंट्स के साथ)।
सच नहीं। GCC 3.4 के बाद से शुरू किए गए केवल C ++ ABI परिवर्तन पिछड़े-संगत थे, जिसका अर्थ है C ++ ABI लगभग नौ वर्षों से स्थिर है।
मामलों को बदतर बनाने के लिए, अधिकांश प्रमुख लिनक्स वितरण जीसीसी स्नैपशॉट और / या अपने जीसीसी संस्करणों का उपयोग करते हैं, जिससे यह जानना लगभग असंभव हो जाता है कि क्या आप जीसीसी संस्करणों का उपयोग कर रहे हैं जब आप बायनेरिज़ वितरित करते हैं।
वितरण के GCC के पैच किए गए संस्करणों के बीच के अंतर मामूली हैं, न कि ABI बदलते हैं, जैसे फेडोरा के 4.6.3 20120306 (Red Hat 4.6.3-2) ABI अपस्ट्रीम FSF 4.6.x रिलीज़ और लगभग निश्चित रूप से किसी भी 4.6 के साथ संगत है। किसी अन्य डिस्ट्रो से एक्स।
GNU / Linux GCC के रनटाइम लाइब्रेरी में ELF सिंबल वर्जनिंग का उपयोग किया जाता है, इसलिए ऑब्जेक्ट्स और लाइब्रेरियों द्वारा आवश्यक सिंबल संस्करणों की जांच करना आसान है, और यदि आपके पास एक libstdc++.so
है जो उन चिह्नों को प्रदान करता है तो यह काम करेगा, यह कोई फर्क नहीं पड़ता कि यह थोड़ा अलग पैच वर्जन है अपने डिस्ट्रो के दूसरे संस्करण से।
लेकिन कोई C ++ कोड (या C ++ रनटाइम सपोर्ट का उपयोग करने वाला कोई भी कोड) गतिशील रूप से लिंक किया जा सकता है अगर यह काम करना है।
यह सच भी नहीं है।
कहा कि, स्टेटिकली लिंकिंग आपके लिए libstdc++.a
एक विकल्प है।
इसका कारण यह नहीं हो सकता है यदि आप गतिशील रूप से एक पुस्तकालय लोड कर रहे हैं (उपयोग कर रहे हैं dlopen
) यह है कि libstdc ++ प्रतीकों पर निर्भर करता है कि यह आपके आवेदन द्वारा आवश्यक नहीं हो सकता है जब आपने इसे (सांख्यिकीय रूप से) लिंक किया था, इसलिए वे प्रतीक आपके निष्पादन योग्य में मौजूद नहीं होंगे। यह साझा लाइब्रेरी को गतिशील रूप से जोड़ने के द्वारा हल किया जा सकता है libstdc++.so
(जो कि इस पर निर्भर होने पर किसी भी तरह से करने के लिए सही काम है।) ईएलएफ प्रतीक पारस्परिकता का अर्थ है कि आपके निष्पादन योग्य में मौजूद प्रतीकों का उपयोग साझा पुस्तकालय द्वारा किया जाएगा, लेकिन अन्य नहीं आपके निष्पादन योग्य में जो भी libstdc++.so
इसके लिंक से मिल जाएगा। यदि आपका एप्लिकेशन उपयोग नहीं करता हैdlopen
तो आपको उसकी परवाह करने की आवश्यकता नहीं है।
एक अन्य विकल्प (और जिसे मैं पसंद करता हूं) libstdc++.so
आपके आवेदन के साथ नए को तैनात करना है और यह सुनिश्चित करना है कि यह डिफ़ॉल्ट सिस्टम से पहले पाया जाता है libstdc++.so
, जो डायनेमिक लिंकर को सही जगह देखने के लिए मजबूर करके किया जा सकता है, या तो $LD_LIBRARY_PATH
रन पर पर्यावरण चर का उपयोग करके- समय, या RPATH
लिंक-टाइम में निष्पादन योग्य में सेट करके । मैं उपयोग करना पसंद RPATH
करता हूं क्योंकि यह काम करने के लिए आवेदन के लिए सही ढंग से सेट किए जा रहे पर्यावरण पर निर्भर नहीं करता है। यदि आप अपने आवेदन को लिंक करते हैं '-Wl,-rpath,$ORIGIN'
(विस्तार करने की कोशिश कर रहे शेल को रोकने के लिए एकल उद्धरणों पर ध्यान दें $ORIGIN
) तो निष्पादन योग्य के पासRPATH
की$ORIGIN
जो निष्पादन को उसी निर्देशिका में साझा पुस्तकालयों के लिए देखो करने के लिए गतिशील लिंकर बताता है। यदि आप नया डालते हैंlibstdc++.so
निष्पादन योग्य के रूप में एक ही निर्देशिका में इसे रन-टाइम, समस्या हल करने पर मिलेगा। (एक अन्य विकल्प निष्पादन योग्य को /some/path/bin/
और नए libstdc ++ में डालना है । इसलिए निष्पादन योग्य के सापेक्ष किसी अन्य निश्चित स्थान के /some/path/lib/
साथ और उसके साथ लिंक करें '-Wl,-rpath,$ORIGIN/../lib'
, और RPATH के सापेक्ष सेट करें $ORIGIN
)
-static-libstdc++
विकल्प का कोई मतलब नहीं होगा, तो आप बस इस्तेमाल करेंगे-static