2009-05-06 6 views
32

में साझा लाइब्रेरी के किसी विशिष्ट संस्करण से कैसे लिंक करते हैं मैं कुछ कोड संकलित कर रहा हूं जो डेबियन लिनक्स सिस्टम पर libcurl का उपयोग करता है। मेरी देव मशीन डेबियन 5 चला रही है लेकिन मैं चाहता हूं कि बाइनरी पुराने डेबियन 4 सिस्टम पर भी प्रयोग योग्य हो।आप जीसीसी

मैं अगर मैं -lcurl यह libcurl.so.4 से लिंक करेगा लेकिन डेबियन 4 सिस्टम केवल libcurl.so.3

है निर्दिष्ट करते हैं कि पता चलता है कि किसी तरह से मैं जीसीसी बताने के लिए लिंक करने के लिए कर सकते हैं या तो libcurl.so.3 (जो डेबियन 4 और 5 दोनों में मौजूद है) या सिर्फ libcurl.so तो यह भी संस्करण का उपयोग करेगा?

+1

पुराने डेबियन पर, libcurl.so libcurl.so.3 के लिए एक symlink नहीं है? मेरा मतलब है, यह अजीब लग रहा है कि -lcurl डिफ़ॉल्ट रूप से सही बात नहीं है। –

+0

कस्तौयरा: संस्करण नहीं हैं, या कम से कम बाइनरी संगत नहीं माना जा सकता है। तो जब आप इसे लिंक करते हैं तो बाइनरी में इसके खिलाफ जुड़े बड़े संस्करण को रिकॉर्ड किया जाता है: यदि आप नए सिस्टम पर संकलित करते हैं तो इसे संस्करण 4 की आवश्यकता होगी और पुराने सिस्टम पर काम नहीं करेगा। (असल में यह रिकॉर्ड करता है कि सोनम, जो लाइब्रेरी फ़ाइल में संग्रहीत एक स्ट्रिंग है जो पारंपरिक रूप से कुछ नहीं है लेकिन "libcurl.so.3") –

उत्तर

22

आप लिंकर कमांड लाइन पर -l के बजाय वास्तविक .so फ़ाइल पास कर सकते हैं, और यह वही करना चाहिए जो आप चाहते हैं।

+1

आह, लगभग libcurl.so को छोड़कर लगभग काम करता है बस सिमलिंक है डेबियन पर lubcurl.so.4 करने के लिए और इसलिए यह अभी भी libcurl.so.4 से जुड़ा हुआ है। –

+0

मैं इसे स्वीकार्य उत्तर के रूप में चिह्नित करूंगा हालांकि यह डेबियन 5 पर libcurl के लिए बिल्कुल सही नहीं है। मैं जो कर रहा हूं वह डेबियन 4 सिस्टम से libcurl.so.3 की एक प्रति प्राप्त कर रहा है और इसे निर्दिष्ट करके सीधे लिंक कर रहा है। तो bdonlan के रूप में फ़ाइल नाम सुझाव दिया। –

1

आपके प्रोजेक्ट में एक सिम्लिंक स्थानीय बनाने के बारे में कैसे है जो .3 से लिंक है, तो आप संकलन समय पर -L का उपयोग कर सकते हैं। मुझे यकीन नहीं है कि अगर आपको नाम का संघर्ष मिल जाएगा, लेकिन आप इसे हमेशा libcurl-old.so कह सकते हैं।

53
इसके बजाय "-lcurl" का उपयोग करने का

का उपयोग करें "-l: libcurl.so.3" और बिल्कुल भी उपयोग "एल _installed_path_"

+0

समान समस्या जब यह सिम्लिंक है। -l: libX.so libX.so.Y के बजाय लिंक – Gregory

+1

यह मेरे लिए आरपीएथ के साथ भी काम नहीं करता है। ldd यह एक चीज़ के साथ जोड़ने से पता चलता है। लिंक आउटपुट सही फ़ाइल नाम दिखाता है। लेकिन स्ट्रेस पुष्टि करता है कि यह फ़ाइल.2.3 के बजाय फ़ाइल 2 लोड कर रहा है और यह एक सिम्लिंक नहीं है। – jgmjgm

+0

मैं इसे एक उत्तर के रूप में चिह्नित करने के लिए प्रेरित हूं। आपने सचमुच मेरा कहना @ इंजीनियर.डेज़ बचाया – user5241806

0

मुझे लगता है कि ऐसा करने के लिए सही तरीका --filter उपयोग करने के लिए किया जाएगा और --auxiliary लिंकर के झंडे।

वे बहुत दस्तावेज नहीं हैं, लेकिन आपको जिस मशीन पर इंस्टॉल किया गया है उसके अनुसार आपको उसी लाइब्रेरी के विभिन्न संस्करणों से प्रतीकों को लोड करने की अनुमति देनी चाहिए।