2012-04-26 18 views
11

मैं ओएस 10.7 शेर पर निर्मित और संकलित मैक प्रोजेक्ट में libcurl का उपयोग कर रहा हूं। मैं अन्य लिंकर ध्वज में -lcurl विकल्प या मेरी प्रोजेक्ट में लाइब्रेरी जोड़कर, गतिशील लाइब्रेरी से बस ठीक से लिंक कर सकता हूं। सब कुछ इसके रूप में काम करता है के रूप में काम करता है।एक्सकोड में, मैं गतिशील लाइब्रेरी (libcurl) को कैसे लिंक करूं ताकि ऐप मैक ओएस के पुराने संस्करणों पर भी काम करे?

मैं एप्लिकेशन को ओएस 10.6 और 10.5 पर भी काम करना चाहता हूं। मैंने तदनुसार तैनाती लक्ष्य निर्धारित किया।

लाइब्रेरी नहीं भरी हुई:: जब मैं ओएस के उन संस्करणों में से एक में अनुप्रयोग चलाने के लिए जाना है, मैं एक dyld त्रुटि मिलती है कारण /usr/lib/libcurl.4.dylib: असंगत पुस्तकालय संस्करण: एक्स संस्करण की आवश्यकता है 7.0.0 या बाद में, लेकिन libcurl.4.dylib संस्करण 6.0.0 प्रदान करता है।

यह मैक ओएस 10.5 के लिए एक समान समस्या है।

मैक ओएस 10.7 पर एक्सकोड में सिस्टम की libcurl लाइब्रेरी के खिलाफ मैं कैसे लिंक कर सकता हूं ताकि एप्लिकेशन 10.6 और 10.5 पर भी चलाया जा सके?

मैं कुछ विकल्प देखा है: Mac OS X libcurl dylib compatibility version मैं ऐसा करते हैं तो आवेदन ठीक काम करता है: के रूप में इस पोस्ट में सुझाव दिया

  1. एक, बेस एसडीके बदलने के लिए है। लेकिन यह मेरे लिए एक विकल्प नहीं है। मुझे 10.7 एसडीके का उपयोग करना होगा, इसलिए एसडीके के पुराने संस्करण में वापसी करना स्वीकार्य नहीं है।

  2. मैंने अन्य लिंकर ध्वज में -weak_library /usr/lib/libcurl.dylib विकल्प का उपयोग करके लाइब्रेरी के खिलाफ कमजोर लिंकिंग करने का प्रयास किया है। जब एप्लिकेशन libcurl प्रतीकों का संदर्भ देने का प्रयास करता है तो एप्लिकेशन लॉन्च होता है लेकिन तब क्रैश हो जाता है। हालांकि, मुझे पता है कि यह असंगत कोड के साथ कोई समस्या नहीं है क्योंकि जब मैं बेस एसडीके बदलता हूं तो यह काम करता है।

  3. मैंने dlopen ("libcurl.dylib", RTLD_LOCAL | RTLD_LAZY) का उपयोग करके कोड के भीतर लाइब्रेरी को गतिशील रूप से लोड करने का प्रयास किया है; लाइब्रेरी लोड होने लगती है, लेकिन फिर मुझे संदर्भित सभी प्रतीकों को मैन्युअल रूप से बांधना होगा?

निश्चित रूप से ऐसा करने का एक तरीका होना चाहिए। Libcurl लाइब्रेरी मैक ओएस 10.5, 10.6, और 10.7 पर स्थापित है, लेकिन एप्लिकेशन मैक ओएस के पुराने संस्करणों पर उपलब्ध लाइब्रेरी का उपयोग करने में विफल रहता है। मैं इसे कैसे ठीक करूं?

उत्तर

7

कुछ विकल्प:

  • मैक फ़्रेमवर्क API (CFNetwork, NSURLConnection, आदि)
  • बिल्ड और अपने अनुप्रयोग के साथ libcurl के अपने स्वयं के संस्करण पैकेज के बजाय प्रणाली पुस्तकालय पर भरोसा करने के लिए libcurl से स्विच ।
  • अपने तैनाती लक्ष्य से संबंधित एसडीके से स्टब लाइब्रेरी को कॉपी या सिम्लिंक करें और इसे स्पष्ट पथ से लिंक करें।
+0

धन्यवाद केन। पहला विकल्प काम नहीं करेगा। मैं एसएसएल के माध्यम से एफ़टीपी चला रहा हूं और न तो सीएफनेटवर्क और न ही NSURLConnection इसका समर्थन करता है। यह निश्चित रूप से पहली जगह थी जिसे मैंने देखा था। =) मैं निश्चित रूप से ऐप के साथ libcurl के अपने संस्करण को पैकेजिंग से बचाना पसंद करूंगा, इसलिए मैं स्टब को सिम्लिंक करने में जा रहा हूं। मेरी चिंता यह है कि मैं 10.5 को लक्षित कर रहा हूं, और मुझे यह भी नहीं पता कि एसडीके शेर पर एक्सकोड 4.3 के लिए उपलब्ध है या नहीं। – Philip

+1

मैं आपके उत्तर को सही के रूप में चिह्नित कर रहा हूं और अन्य उपयोगकर्ताओं को अनुशंसा करता हूं कि वे तीसरे विकल्प का पालन करें। एक कामकाजी समाधान वास्तव में एसडीके के पिछले संस्करण को प्राप्त करने के लिए है और libcurl.4.dylib को 10 से कॉपी करें।7 एसडीके निर्देशिका - जो अब एक्सकोड अनुप्रयोग पैकेज के अंदर निहित है। आपको पहले मूल का बैक अप लेना चाहिए। पुस्तकालय के उस संस्करण के खिलाफ एक्सकोड लिंक जो आपको 10.7 में नए संस्करण के लिए शीर्षलेख प्रदान करते हैं। इसका मतलब है कि आवेदन कोड में उपयोग करने से पहले प्रतीकों की उपलब्धता की जांच करनी चाहिए। – Philip