2013-05-08 10 views
7

मैं समझने की कोशिश कर रहा हूं कि g ++ libstdC++ का कौन सा संस्करण चुनता है और इसका अर्थ यह है कि लाइब्रेरी का "सिस्टम" संस्करण अलग है। ।कंपाइलर libstdC++ संस्करण बनाम सिस्टम संस्करण

-rwxr-xr-x 1 root root 4397810 May 18 2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8 

ABI की मेरी समझ पर आगे आधार पर:

मैं उपयोग कर रहा हूँ जीसीसी/जी ++ 4.1.2, जो ABI Guidelines दस्तावेज़ के अनुसार, libstdC++ so.6.0.8, और यकीन है कि पर्याप्त शामिल -compatibility, मैं g ++ 4.1.2 के साथ निर्माण कर सकता हूं और कोड को 6.0.8 से libstdC++ के बाद के संस्करण के साथ सिस्टम पर चलाने की उम्मीद करता हूं, लेकिन पहले संस्करण के साथ एक पर नहीं, क्योंकि उसके पास एबीआई का पुराना संस्करण होगा ।

एक ही मशीन पर के एक पुराने संस्करण है libstdC++ में/usr/lib:

-rwxr-xr-x 1 root root 804288 Jul 22 2005 /usr/lib/libstdc++.so.6.0.3 

अगर मैं इस मशीन पर जी ++ 4.1.2 का उपयोग कर कोड संकलन है, तो यह ldd, मैं के संस्करण देख libstdC++ में/usr/lib संदर्भित है, जो 6.0.3 है:

# ldd test 
. 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000) 
. 

यह आशा की जाती है, के रूप में/usr/lib पहले चेक किया गया है। और आवेदन ठीक चलाता है।

मेरा सवाल है: यहां क्या हुआ है?

क्या जी ++ 4.1.2 libstdC++ के संस्करण के खिलाफ जुड़ा हुआ है। तो यह उस रिलीज का हिस्सा है (6.0.8)? यदि हां, तो निष्पादन योग्य पुराने संस्करण को/usr/lib में रनटाइम पर कैसे उपयोग कर सकता है, जब उसके पास पुरानी एबीआई हो? भाग्य?

या जी ++ 4.1.2 ने लिंक समय पर libstdC++ (6.0.3) के/usr/lib संस्करण को उठाया है और इसका उपयोग किया है, क्योंकि यह लाइब्रेरी पथ को उसी तरह से हल करता है जैसे एक्जिक्यूटिव रनटाइम पर करते हैं? क्या g ++ ऐसा कर सकता है, भले ही libstdC++ उसका "स्वयं" संस्करण न हो? G ++ 4.1.2 (6.0.8) में libstdC++ संस्करण का उद्देश्य क्या है? क्या इस प्रक्रिया में इसका इस्तेमाल किया गया है?

किसी भी अंतर्दृष्टि की सराहना की।

+1

कंपाइलर/लिंकर 6.0.8 चुनता है, रनटाइम लोडर 6.0.3 चुनता है। यह अच्छी तरह खत्म हो सकता है या नहीं। लाइब्रेरी को ढूंढने के लिए रनटाइम लोडर को बताने के लिए, लिंकर ('-Wl, -rpath ... 'जब gcc/g ++ से कहा जाता है) के लिए' -rpath/path/to/folder/with/lib' तर्क 'का उपयोग करें। वैसे 4.1.2 प्राचीन कई बार खत्म हो गया है। –

+1

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html –

उत्तर

9

जीसीसी निर्देशिका निर्देशिका सूची के अनुसार सभी पुस्तकालयों का चयन करता है। आप इसे इस तरह देख सकते हैं:

gcc -print-search-dirs 

सूची आमतौर पर कंपाइलर संस्करण के लिए विशिष्ट पुस्तकालयों को पसंद करती है, यदि कोई है।

हालांकि, लिंक-टाइम विकल्प रन-टाइम पसंद के समान नहीं हो सकता है।

यदि लिंकर कमांड में -rpath विकल्प शामिल है (कुछ टूलचेन विक्रेताओं में एक गैर-मानक एक शामिल हो सकता है) तो डायनामिक लिंकर रन-टाइम पर सही लाइब्रेरी खोजने के लिए इसका उपयोग करेगा। अन्यथा सिस्टम अपनी डिफ़ॉल्ट लाइब्रेरी का उपयोग करेगा।

यदि दो पुस्तकालय अच्छी तरह से मेल नहीं खाते हैं तो बुरी चीजें हो सकती हैं। सी पुस्तकालय (आमतौर पर glibc) हमेशा अनुकूलता बनाए रखने के लिए सावधान रहा है। सी ++ लाइब्रेरी में हमेशा यह विलासिता नहीं होती है। हाल के वर्षों में यह सुरक्षित रहा है लेकिन कई लोग अभी भी मिश्रण और मिलान करने की सलाह देते हैं।

1

डिफ़ॉल्ट रूप से, जीसीसी/usr/lib पथ में पुस्तकालयों का उपयोग करता है।
1. जीसीसी/जी ++ 4.1.2 libstdC++ के नवीनतम संस्करण से जुड़ा नहीं है। इसलिए 2.6.0.8।
2. जी ++ 4.1.2 ने लिंक समय पर libstdC++ (6.0.3) के/usr/lib संस्करण को उठाया।

यह अभी भी सिस्टम डिफ़ॉल्ट libstdC++ का उपयोग करता है। इसलिए 2.6.0.3 जब तक आप स्पष्ट रूप से लाइब्रेरी पथ सेट नहीं करते हैं।

libccdC++ के नवीनतम संस्करण का उपयोग करने के लिए जीसीसी/जी ++ 4.1.2 के लिए। तो.6.0.8, आपको संकलन से पहले लाइब्रेरी पथ निर्यात करना होगा।

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib 

अब जीसीसी/जी ++ 4.1.2, libstdC++ का उपयोग करके लिंक करते समय, 2.6.0.8 का उपयोग किया जाएगा।

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