पर जीसीसी के सिस्टम संस्करण द्वारा उपयोग किए गए सी ++ एबीआई की जांच कैसे करें मेरे पास एक कॉन्फ़िगरेशन जांच है जो निर्धारित करता है कि प्लेटफ़ॉर्म और संस्करण के आधार पर g ++ को किस झंडे को पास करना है। मैं आमतौर पर सी ++ 14 सुविधाओं तक पहुंच प्राप्त करने के लिए देशी इंस्टॉल संस्करण की तुलना में जीसीसी के बाद के संस्करण का उपयोग करता हूं। पुराने प्लेटफॉर्म पर इसका मतलब है कि मुझे पुराने C++ एबीआई का उपयोग करने के लिए -D_GLIBCXX_USE_CXX11_ABI = 0 जोड़ने की आवश्यकता है या मैं C++ लाइब्रेरीज़ के होस्ट संस्करणों से लिंक नहीं कर सकता। हालांकि कुछ नए प्लेटफ़ॉर्म नए एबीआई का उपयोग करते हैं, जिसमें मामले -D_GLIBCXX_USE_CXX11_ABI = 1 (या बिल्कुल भी नहीं) आवश्यक है।लक्ष्य प्लेटफ़ॉर्म
मैं लक्ष्य प्लेटफ़ॉर्म के संस्करण (यानी lsb_release -a के आउटपुट) के आधार पर ऐसा कर सकता हूं लेकिन मुझे एक और सामान्य विधि चाहिए।
मुझे लगता है कि मैं मूल संकलक (मेरे बाद के एक के विपरीत) के साथ एक सी ++ हैलो वर्ल्ड प्रोग्राम संकलित करने के साथ आधा रास्ता हूं, लेकिन मैं एबीआई संस्करण की जांच कैसे कर सकता हूं, इस बारे में काफी जानकारी नहीं दे सकता। ईजी।
>strings hello | grep ABI .note.ABI-tag >strings hello | grep CXX GLIBCXX_3.4
या इसी तरह हेल्लो जांच कार्यक्रम द्वारा उपयोग किए गए libstdC++ के संस्करण पर।
ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep
क्या किसी के पास कोई बेहतर सुझाव है?
अद्यतन: वास्तव में मुझे यह करने की आवश्यकता नहीं है। मेरी असली समस्या यह थी कि मेरे पास libstdC++ का पुराना संस्करण था। इसलिए आसपास लटक रहा था। संकलन ने एक संस्करण 6.0.20 उठाया और रनटाइम ने एक असंगत एक 6.0.1 9 (या संभवतः वीज़ा बनाम) उठाया। मेरे पास एक अनसुलझा प्रतीक था जिसे मैंने एबीआई संस्करण पर गलत तरीके से दोषी ठहराया था। लोकप्रिय विश्वास के विपरीत libstdC++ के मामूली संस्करण हमेशा बाइनरी संगत नहीं होते हैं। मेरा इरादा हमेशा चलने और संकलित समय पर सटीक उसी संस्करण का उपयोग करना है (यदि मेजबान देशी का उपयोग नहीं कर रहा है)।
मैंने प्रश्न का उत्तर नहीं दिया लेकिन मेरी समस्या हल करने के बाद उत्तर अब मेरे लिए महत्वपूर्ण नहीं है। यह सवाल बंद किया जा सकता है। –
libstdC++ आगे संगत है, मुझे यह भी यकीन नहीं है कि वे अर्थपूर्ण संस्करण के किसी भी रूप का पालन करते हैं। मैं शर्त लगाता हूं कि यदि आप 6.0.1 9 से जुड़े हैं और परिणामी कोड 6.0.20 के साथ चलाया है, तो यह ठीक काम करेगा। – rubenvb
जबकि यह सच होना चाहता था। आपको अभी भी समस्याएं हो सकती हैं। मैंने पुस्तकालय के बाद के संस्करण का उपयोग करके कुछ (आंतरिक) कार्यक्रम तोड़ दिए जो कि कुछ सूक्ष्म तरीके से असंगत थे। मैं इस तरह एक सिस्टम प्रोग्राम तोड़ने का जोखिम नहीं लेना चाहता क्योंकि यह डीबग करना बहुत मुश्किल होगा। यह भी देखें http://stackoverflow.com/questions/25979778/forcing-or-preventing-use-of-a-particular-minor-version-of-libstdc –