2012-07-31 12 views
12

मैं वर्तमान में एक बहुत बड़ी कोड आधार के लिए एक एकल Xcode प्रोजेक्ट है, मैं इसे परियोजना एक्स फोन करता हूँ, जो मैं उप परियोजनाओं का एक समूह (परियोजनाओं एक में विभाजित कर रहा हूँ , बी, सी)।लिंक करना स्थिर पुस्तकालयों, कि शेयर एक और स्थिर पुस्तकालय

अभी तक, इनमें से प्रत्येक परियोजनाएं स्वयं ही संकलित होती हैं, ठीक है। वे सभी स्थिर पुस्तकालयों का उत्पादन करते हैं। प्रोजेक्ट बी और प्रोजेक्ट सी निर्माण के लिए प्रोजेक्ट ए द्वारा निर्मित स्थिर लाइब्रेरी पर निर्भर हैं।

मैं एक xcode परियोजना, परियोजना जेड, कि परियोजनाओं बी और सी द्वारा उत्पादित स्थिर पुस्तकालयों की आवश्यकता है। यहां समस्या निहित है। परियोजना जेड लिंकर चरण में प्रवेश करती है, चीजों को उड़ाने - डुप्लिकेट प्रतीकों के लिए परियोजनाओं बी और सी libs कोड के लिए वे मूल रूप से प्रोजेक्ट ए में के खिलाफ जुड़ा हुआ भीतर पाए जाते हैं!

मैं बहुत स्थिर पुस्तकालयों की दुनिया के लिए नया हूँ, और मैं कैसे परियोजना जेड साथ आगे बढ़ने के लिए की अनिश्चित हूँ, या तो यह है कि वे एक ही प्रोजेक्ट ए के खिलाफ लिंक कर रहे हैं कि कैसे अन्य परियोजनाओं को संशोधित करने के lib। मुझे लगता है कि यह संभव नहीं है। मेरे लिए यहां क्या विकल्प हैं?

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

मैं स्पष्ट करना चाहिए कि परियोजना बी और परियोजना सी अलग स्थिर libs में निर्माण करने के लिए है क्योंकि कुछ ग्राहकों केवल एक या दूसरे की आवश्यकता होगी की जरूरत है।

इसके अलावा, मुझे ओएसएक्स और आईओएस प्लेटफॉर्म दोनों पर यह दुविधा है।

मुझे एहसास है कि मैं ओएसएक्स पर गतिशील पुस्तकालयों के रूप में परियोजनाओं का निर्माण करके इस समस्या को हल कर सकता हूं। हालांकि, मैं ऐसा नहीं करना पसंद करूंगा, और यह अभी भी मुझे आईओएस पर एक ही मुद्दे के साथ छोड़ देता है।

उत्तर

16

स्टेटिक पुस्तकालयों में कभी भी अन्य स्थैतिक पुस्तकालयों (या सामान्य रूप से तृतीय पक्ष कोड) शामिल नहीं होना चाहिए। एक स्थैतिक पुस्तकालय एक साथ चिपके हुए .o फ़ाइलों का एक बंडल है। तो यदि आपके पास एक ही जानकारी की कई प्रतियां हैं, तो यह उड़ाएगी।

प्रत्येक स्थैतिक पुस्तकालय में इसका अपना कोड होना चाहिए। अंतिम आवेदन सभी आवश्यक पुस्तकालयों को एक साथ जोड़ने के लिए ज़िम्मेदार है (पुस्तकालयों द्वारा आवश्यक पुस्तकालयों सहित)। इस तरह से जुड़ी प्रत्येक चीज की बिल्कुल एक प्रति है।

+1

हाँ, आप समस्या के बारे में सही हैं। मैं प्रोजेक्ट बी और प्रोजेक्ट सी को प्रोजेक्ट ए प्रोजेक्ट्स बी और सी को संदर्भित करके इस मुद्दे को हल नहीं कर रहा हूं, फिर भी प्रोजेक्ट ए को निर्भरता के रूप में संदर्भित करता हूं, और इसलिए वे ठीक निर्माण करने में सक्षम हैं। चूंकि ग्राहक हमेशा इन परियोजनाओं के साथ परियोजना ए शामिल करेंगे, सभी प्रतीकों पाए जाते हैं और चीजें बस काम करती हैं। – Jeff

+0

@ जेफ ने आप को "निर्भरता" कैसे बनाया ताकि अन्य लोग निर्माण कर सकें, जबकि वास्तव में उनके निर्माण में ए (ए) को जोड़ना नहीं है? – johnbakers

+1

@Rob मैंने देखा है कि एक्सकोड में यदि मैं एक स्थिर लाइब्रेरी बनाता हूं जिसमें केवल एक अन्य लाइब्रेरी में हेडर शामिल है, लेकिन अन्य लाइब्रेरी की बाइनरी से लिंक नहीं है, तो बिल्ड ठीक हो जाता है। यदि मैं इसे वास्तविक प्रोग्राम प्रोजेक्ट (लाइब्रेरी नहीं) के साथ करता हूं तो लिंकिंग चरण (त्रुटियों) में अपरिभाषित परिभाषाएं हैं। मुझे लगता है कि जब आप एक पुस्तकालय बनाते हैं, तो लिंकिंग चरण के इस हिस्से को "छोड़ना" सामान्य है, जबकि वास्तविक कार्यक्रम, जब निर्मित होते हैं, तो अतिरिक्त लिंक चेक करते हैं, क्या यह सही है? (और यह होगा कि संकलक वास्तव में क्या कर रहा है अगर इसे पुस्तकालय बनाने का निर्देश दिया जाता है?) – johnbakers

2

यह ठीक तरह की समस्या की तरह लगता है CoacoaPods हल करने के लिए बनाया गया था। यदि आप प्रत्येक प्रोजेक्ट प्रोजेक्ट्स के लिए फली को परिभाषित करते हैं तो जेड डुप्लिकेट प्रतीकों को पेश किए बिना श्रृंखला के सभी तरीकों से सभी तरह की निर्भरताओं को निर्धारित और लिंक करने में सक्षम होना चाहिए।

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