2010-05-26 21 views
14

मेरे पास दो तृतीय पक्ष पुस्तकालय हैं जो एक ही कक्षा का उपयोग करने लगते हैं। यह ठीक किया जाना चाहिए, लेकिन जब निर्माण मैं इस प्रकार की त्रुटि हो रही है:तृतीय पक्ष पुस्तकालयों से डुप्लिकेट प्रतीक त्रुटि को कैसे संभालें?

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o) 

मैं इस मुद्दे को कैसे संभाल कर सकते हैं ...

- संपादित करें -

... अगर स्रोत फाइलें उपलब्ध नहीं हैं?

उत्तर

0

यदि आपके पास स्थिर पुस्तकालयों दोनों के स्रोत हैं, तो उनमें से एक को CJSONScanner क्लास के बिना बनाएं। यदि आप पुस्तकालयों में से किसी एक से CJSONScanner.o निकालने के लिए कमांड लाइन से "ar" का उपयोग नहीं कर सकते हैं।

शायद कुछ जादू ध्वज आप इसे ठीक करने के लिए "एलडी" पास कर सकते हैं, लेकिन मुझे इसे हाथ से नहीं पता है।

+0

"ar" का क्या अर्थ है? – user230949

+0

बस, 'ar' कमांड-लाइन टूल का नाम है। यदि आप 'मैन ar' टाइप करते हैं, तो आपको कार्यक्षमता के विवरण सहित विस्तृत जानकारी दिखाई देगी: "लाइब्रेरी अभिलेखागार बनाएं और बनाए रखें"। '-x' विकल्प निकालने के लिए है, लेकिन ऐसा लगता है कि आप इसके बजाय '-d' को हटाना चाहते हैं। –

+0

अधिकतर ये वसा फाइलें हैं और अकेले 'ar' पर्याप्त नहीं होगा। ऐसा करने के लिए उसे 'लिपो' और 'लिबतोल' की भी आवश्यकता होगी। –

31

मुझे लगता है कि ये दो तृतीय पक्ष पुस्तकालय हैं जिन्होंने आपको केवल .a फाइलें प्रदान की हैं, न कि स्रोत कोड। आप फाइलों को निकालने और पुनः संयोजित करने के लिए टर्मिनल पर libtool, lipo और ar का उपयोग कर सकते हैं। ,

$ lipo -info libTapjoy.a 
Architectures in the fat file: libTapjoy.a are: armv6 i386 

तो बस ARMv6 निकालने के लिए उदाहरण के लिए::

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a 
$ mkdir armv6 
$ cd armv6 
$ ar -x ../libTapjoy-armv6.a 

फिर आप उसी में अन्य पुस्तकालय से एक ही वास्तुकला निकाल सकते हैं

क्या आर्किटेक्चर फ़ाइल में हैं देखने के लिए निर्देशिका और उसके बाद उन्हें पुन: संयोजित करें:

$ libtool -static -o ../lib-armv6.a *.o 

और फिर अंत में, af Ter आप प्रत्येक वास्तुकला के साथ ऐसा कर लेंगे, आप लाइपो के साथ फिर से उन्हें गठजोड़ कर सकते हैं:

$ cd .. 
$ lipo -create -output lib.a lib-armv6.a lib-i386.a 

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

+0

तो, क्या इसका मतलब है कि मेरी परियोजना को केवल lib.a का संदर्भ देना चाहिए और अन्य दो लाइब्रेरी फ़ाइलों को नहीं? – user230949

+0

यदि आप इसे ठीक तरह से करना चाहते थे, तो हाँ, आप अन्य दो फाइलों को हटा देंगे और नए का उपयोग करेंगे। –

+0

मैंने अभी एक lib पर पाया है कि मैं काम कर रहा था कि मुझे 'लिपो -extract_family armv6'' कॉल करने से पहले 'lipo -remove armv7'' कॉल करना पड़ा था। – Liron

1

कोरी किल्गर का जवाब जाने का सही तरीका है ... केवल एक मामूली चिमटा क्योंकि मेरे पास टिप्पणी करने की प्रतिष्ठा नहीं है।

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a 

लाइपो के लिए आदमी पेज -extract कहते हैं और -extract_family दोनों का उत्पादन:

मेरी मैक ओएस 10.8 प्रणाली पर, इस लाइपो आदेश एक मैं ar साथ प्रयोग के लिए ए फ़ाइलें बनाने के लिए प्रयोग किया जाता है सार्वभौमिक .a फ़ाइलें और मेरी ar कमांड उनसे कुछ भी निकालने नहीं देगा।

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