2011-04-04 8 views
31

मैं कोको टच स्टेटिक लाइब्रेरी प्रोजेक्ट्स के साथ एक्सकोड 4 का उपयोग करके वर्कस्पेस में प्रोजेक्ट्स प्रबंधित करना चाहता हूं जिसमें साझा कोड शामिल है जिसे मैं अन्य परियोजनाओं से संदर्भित कर सकता हूं। डब्ल्यूडब्ल्यूडीसी 2010 के वीडियो और एक्सकोड 4 दस्तावेज के मुताबिक एक्सकोड 4 में वर्कस्पेस के लिए "निहित निर्भरता" की सुविधा है। मैं इसे काम करने की कोशिश कर रहा हूं और मुझे ज्यादा सफलता नहीं मिल रही है।एक्सकोड 4 में वर्कस्पेस के साथ काम करने के लिए आप निहित निर्भरताओं को कैसे प्राप्त करते हैं?

नमूना कार्यस्थान: DependenciesInXcode4.zip

आप बहुत ही बुनियादी नमूना परियोजना जो मैं Library1 और Library2 नामित 2 स्थिर पुस्तकालय परियोजनाएं हैं देख सकते हैं। मेरे पास प्रत्येक प्रोजेक्ट में एक एकल श्रेणी है जिसे मैं प्राथमिक ऐप नामक आईफोन प्रोजेक्ट से संदर्भित करता हूं। आयात कथन जोड़ते समय मुझे कोड सेंस से समर्थन मिलता है लेकिन बिल्ड विफल हो जाता है।

Build Failed

आप देख सकते हैं कि निर्माण में विफल रहता है, क्योंकि यह निर्भरता नहीं मिल रहा।

Build Errors

इन मुद्दों मैं जोड़ा हल करने के लिए मैन्युअल रूप से Library1 और Library2 परियोजनाओं जुड़े।

Manual Linking

मैं भी हैडर खोजें पथ के रूप में इन परियोजनाओं के लिए पथ को जोड़ने के लिए किया था।

Manually Reference Headers

अब मैं निर्भरता पुस्तकालयों के दोनों जब निर्माण और उसके बाद iPhone सिम्युलेटर इसे सफलतापूर्वक और रन बनाता में PrimaryApp चलाते हैं। मैंने पाया है कि यह हमेशा यह सुनिश्चित नहीं करता है कि जब निर्भर हो तो निर्भरता परियोजनाएं बनाई जाएंगी और यह स्पष्ट रूप से एक मैन्युअल प्रक्रिया है। एक्सकोड वीडियो और दस्तावेज़ीकरण के रूप में मैं "अंतर्निहित निर्भरताओं" पर विचार नहीं करता हूं, यह दर्शाता है कि इसे काम करना चाहिए। मैं और अधिक ठोस उदाहरण ढूंढ रहा हूं लेकिन अब तक मुझे कोई भाग्य नहीं मिला है। यहां तक ​​कि Stackoverflow पर भी मुझे एक संतोषजनक उत्तर नहीं दिख रहा है।

ऐसा लगता है कि डेवलपर्स पुराने तकनीक के लिए वापस गिर रहे हैं और सही मायने में नए "निहित निर्भरता" सुविधाओं का उपयोग नहीं।

मैं Xcode 4 में कार्यस्थानों के साथ काम करने "निहित निर्भरता" पाने के लिए समझने के साथ कुछ मदद की सराहना करेंगे,

यहाँ मेरी प्रश्न हैं:

  • कर रहे हैं "निहित निर्भरता" करने वाला कैसे वर्कस्पेस के साथ एक्सकोड 4 में काम करें?
  • लीबिया 1 और लाइब्रेरी 2 में कोड प्राथमिक ऐप में स्वचालित रूप से क्यों नहीं मिल सकता है?
  • निर्भरता कार्यक्षेत्र में कार्य करने के लिए आवश्यक अतिरिक्त परिवर्तन हैं?
+0

अधिक चर्चा और भ्रम निहित निर्भरता पर Apple डेवलपर मंच पर पाया जा सकता और साथ ही। https://devforums.apple.com/message/379275#379275 – Brennan

+0

मैंने अंतर्निहित निर्भरताओं का उपयोग करने और बिल्ड प्रक्रिया के साथ परियोजना निर्भरताओं को प्रबंधित करने के लिए योजनाओं का उपयोग करने के तरीके को स्पष्ट करने के लिए अधिक दस्तावेज़ीकरण का अनुरोध करने के लिए एक बग रिपोर्ट सबमिट की है। कृपया इसके लिए वोट दें ताकि इसे अधिक ध्यान दिया जा सके। https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/2/wo/T2euYb0sLISyNzvdnb76Lw/9.60 – Brennan

+0

बग रिपोर्ट लिंक काम नहीं कर रहा है। इसे आज़माएं: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/27/wo/Qa6tMGk8o1ZNb1Rl6Sn0g0/5.83.28.0.13 – Brennan

उत्तर

12

मैंने अभी तक इस परियोजना के साथ संघर्ष करने के लिए दो दिनों के निर्माण और पुनर्निर्माण का सर्वोत्तम हिस्सा बिताया है।जबकि अब मेरे पास एक प्रोजेक्ट है जो सही तरीके से बनाता है और लिंक करता है और वर्किंग कोडेंस है, मैं एक कदम के साथ 100% खुश नहीं हूं क्योंकि यह एक हैक का थोड़ा सा लगता है और निश्चित रूप से "स्वचालित निहित निर्भरताओं" की मेरी अवधारणा को फिट नहीं करता है। ।

FWIW यहां दिए गए चरणों मैं हुए थे:

  1. Xcode में एक नया कार्यस्थान बनाएँ।
  2. अपनी स्थिर लाइब्रेरी के लिए वर्कस्पेस में एक नई परियोजना जोड़ें। आप एक मौजूदा प्रोजेक्ट भी जोड़ सकते हैं, मुझे यह भी काम करने के लिए मिला।
  3. परीक्षण करें कि पुस्तकालय अपेक्षा के अनुसार बनाता है।
  4. अपनी मुख्य परियोजना के लिए वर्कस्पेस में एक नई परियोजना जोड़ें। फिर से मैं एक मौजूदा एक जोड़ने में कामयाब रहा, लेकिन महत्वपूर्ण बात यह है कि पुस्तकालय से जुड़ी कोई भी बिल्ड सेटिंग्स पहले से ही नहीं थी। यदि आप एक नई परियोजना जोड़ते हैं तो इसमें मौजूदा स्रोत फ़ाइलों को जोड़ने के लिए यह काफी आसान है। मेरी विशेष स्थिति एक बहुत बड़ी पूर्व-मौजूदा एसवीएन भंडार द्वारा जटिल थी जिसे मैं पुन: स्थापित नहीं करना चाहता था।
  5. इस चरण में मुझे लगता है कि आपके स्रोत कोड में पहले से ही स्थिर पुस्तकालय से शीर्षलेखों का आयात शामिल है।
  6. मुख्य प्रोजेक्ट के निर्माण चरणों में, "लाइब्रेरी के साथ लिंक बाइनरी" अनुभाग का विस्तार करें और + प्रतीक पर क्लिक करें। अपनी स्थिर पुस्तकालय परियोजना से लक्ष्य का चयन करें।
  7. यदि आप इस चरण में चाहते हैं तो आप मुख्य परियोजना का निर्माण कर सकते हैं यह पुष्टि करने के लिए कि यह ओपी स्क्रीन शॉट्स में दिखाया गया है जैसे हेडर आयात के लिए "ऐसी कोई फ़ाइल ..." त्रुटियों के साथ।
  8. अब यह थोड़ा सा मुझे पसंद नहीं है। अपनी मुख्य परियोजना में एक नया समूह बनाएं और इसे निर्भर हेडर या जो कुछ भी कहें। अब प्रोजेक्ट नेविगेटर किसी भी प्रयुक्त हेडर को अपने स्थिर प्रोजेक्ट से इस नए समूह में खींचें। विकल्पों में पॉप अप मैंने इसे डिफ़ॉल्ट सेटिंग्स के रूप में छोड़ दिया।
  9. आपको अपनी मुख्य लाइब्रेरी द्वारा उपयोग की जाने वाली किसी भी निर्भर पुस्तकालय के साथ अपनी मुख्य परियोजना को भी लिंक करने की आवश्यकता हो सकती है। उदाहरण के लिए मेरी स्थैतिक लाइब्रेरी libxml2 और CFNetwork का उपयोग करती है और भले ही मेरा मुख्य प्रोजेक्ट सीधे उनका उपयोग नहीं करता है, मैंने त्रुटियों को संकलित किया है यदि मैंने उन्हें "पुस्तकालयों के साथ लिंक बाइनरी" निर्माण चरण में नहीं जोड़ा है।
  10. आपकी मुख्य परियोजना अब (उम्मीद है) निर्माण करना चाहिए।

मुझे वास्तव में चरण 8 और 9 पसंद नहीं हैं। यह वास्तव में ऐसा लगता है जैसे एक्सकोड ऐसा करने के लिए विज्ञापित नहीं कर रहा है। हालांकि अगर कम से कम इन चरणों को ठीक किया जाता है तो इन चरणों को वापस करने में काफी आसान होता है ताकि यह सही तरीके से काम कर सके।

मुझे लगता है कि "निहित निर्भरता" को पिछले चरण 6 जाने की आवश्यकता के बिना काम करना चाहिए, शायद 5 कदम भी हो सकता है लेकिन यह बहुत से लोगों के स्वाद के लिए बहुत ही स्वैच्छिक हो सकता है।

+0

रिक, मैं सहमत हूं।मैंने ऐप्पल के साथ एक बग रिपोर्ट दायर की है और उम्मीद है कि इस प्रक्रिया को अल्प अवधि में दस्तावेज़ीकरण में स्पष्ट किया गया है और अंततः एक और स्वचालित तरीके से काम करने के लिए बनाया गया है क्योंकि हम भविष्य में एक्सकोड रिलीज में उम्मीद कर रहे हैं। – Brennan

+2

चरण 8 इसलिए है क्योंकि वर्कस्पेस वास्तव में आपके प्रोजेक्ट पर "घुसपैठ" नहीं करता है, इसलिए वर्कस्पेस में अन्य प्रोजेक्ट्स जोड़ने से वास्तव में उन्हें कार्यक्षेत्र में पहले से मौजूद सभी परियोजनाओं में शामिल नहीं किया जाता है ... आपको लाइब्रेरी और हेडर जोड़ना होगा पथ जैसे आप एक स्टैंडअलोन परियोजना के लिए भी करेंगे। मुझे सच में यकीन नहीं है कि यह "विज्ञापित" नहीं है क्योंकि यह आपको अन्य परियोजना में दृश्यता देता है जब आपके पास दोनों डब्ल्यूएस में होते हैं। हालांकि मैं मानता हूं कि यह बहुत परेशान है, और इस तरह मैंने सोचा कि यह पहले भी काम करेगा। मुझे यकीन नहीं है कि यह वास्तव में एक बग है जितना उम्मीद हैडलिंग। –

+0

धन्यवाद, यह मेरे लिए काम करता है, लेकिन मेरी समस्या तब होती है जब मेरे पास स्थिर लाइब्रेरी में विस्तार विधि होती है और मैं इसे मुख्य ऐप में कॉल करता हूं, यह त्रुटि "अज्ञात चयनकर्ता को उदाहरण के लिए भेजा गया ..." ... कोई विचार है? – ali

1

एक और विकल्प केवल एक "उपप्रोजेक्ट" की जड़ को रिकर्सिव हेडर पथ के रूप में शामिल करना है। उदाहरण के लिए यदि आपके पास AcmeLib है, तो आप मुख्य प्रोजेक्ट के बिल्ड विकल्पों पर जा सकते हैं और रिकर्सिव विकल्प सक्षम के साथ, उपयोगकर्ता शीर्षलेख खोज पथ पर AcmeLib के पथ को जोड़ सकते हैं। फिर आपकी AcmeLib की शीर्षलेख फ़ाइलों को स्वचालित रूप से खोजा जाएगा।

डेवलपर्स के बीच पथ स्वतंत्रता बनाए रखने के लिए आप एक स्रोत निर्देशिका चर के सापेक्ष पथ बना सकते हैं, $ ACME_LIB कहें, जो प्रत्येक डेवलपर XCode प्राथमिकताओं "स्रोत" फलक में डिवाइस कर सकता है।

तो एक नई परियोजना में AcmeLib का उपयोग करने के लिए, बस प्रोजेक्ट में खींचें, हेडर खोज पथ में $ ACME_LIB जोड़ें, और आप जाने के लिए अच्छे हैं। एक्सकोड के निहित लिंकिंग निर्भरताओं को हुक करना चाहिए।

+0

यदि आपके पास श्रेणियों के साथ पुस्तकालय हैं, तो आपको कुछ अतिरिक्त लिंकर झंडे जोड़ने की भी आवश्यकता हो सकती है: -ObjC -force_load $ TARGET_BUILD_DIR/libAcme.a –

3

यह वास्तव में निर्माण प्रक्रिया के दौरान एक्सकोड की अंतर्निहित निर्भरताओं के संचालन में एक बग प्रतीत होता है।

दो परियोजनाओं के साथ एक कार्यक्षेत्र में, मैं प्रोजेक्ट बी में प्रोजेक्ट ए को कक्षाएं देखने में सक्षम था और परियोजना बी की कक्षाओं में प्रोजेक्ट बी की कक्षाओं के लिए .h हेडर फ़ाइलों की प्रतिलिपि बनाकर सफलतापूर्वक निर्माण कर रहा था। नोट: मैंने उन्हें एक्सकोड में प्रोजेक्ट ए में नहीं जोड़ा है, मैंने उन्हें फाइंडर में प्रोजेक्ट ए की निर्देशिका में रखा है।

यह कहीं और उल्लिखित देखा गया है, यह एक बहुत ही आसान समाधान है, क्योंकि इसे वर्कस्पेस योजनाओं या किसी भी परियोजना की बिल्ड सेटिंग्स में कोई बदलाव की आवश्यकता नहीं है। प्रोजेक्ट ए की निर्देशिका में .h फाइलों के साथ, एक्सकोड प्रोजेक्ट बी

दुर्भाग्यवश आप .h फ़ाइलों को "एक्सकोडबग वर्कराउंडहेडरफ़ाइल" नामक अपनी उपनिर्देशिका में नहीं डाल सकते हैं, पर स्वचालित रूप से प्रोजेक्ट ए की अंतर्निहित निर्भरताओं को ढूंढने और हल करने में सक्षम था। उन्हें एक निर्देशिका में होना है कि परियोजना पहले से ही .h फाइलों को पढ़ रही है। इसके अलावा, एलियस काम नहीं करेगा, लेकिन सिंबल लिंक होगा, इसलिए सिमलिंक्स का उपयोग करके आपको पुरानी प्रतियों के बारे में चिंता करने की ज़रूरत नहीं है।

इस सब के साथ, मुझे यकीन नहीं है कि "चुपके" .h फाइलें जो निर्माण निर्माण बिना विफल हो जाएंगी, एक अच्छा विचार है। जब तक कि एक्सकोड में बग ठीक नहीं हो जाता है, तब तक उन्हें प्रोजेक्ट में जोड़ने के लिए शायद सबसे अच्छा है ताकि आप उन्हें एक्सकोड में देख सकें।

1

मुझे यह निम्नलिखित करने के लिए काम करने के लिए मिला। 1. वर्कस्पेस को दूसरी परियोजना के रूप में लाइब्रेरी जोड़ना। 2. पुस्तकालयों के साथ लिंक बाइनरी> स्थिर पुस्तकालय जोड़ें।

- महत्वपूर्ण भाग -

  1. "हैडर खोजें पथ" पर निम्नलिखित को जोड़ निर्माण सेटिंग के तहत

    $ {BUILT_PRODUCTS_DIR}

यह लिंक करेगा प्रोजेक्ट में हेडर फाइलें बनाई गईं। कोई और त्रुटियां नहीं बनाते हैं।

+2

यह मेरे लिए काम नहीं करता है। –

1

उपयोगकर्ता हैडर खोज पथ में रिक्त स्थान के बारे में समस्याओं को हल करने के लिए, का उपयोग

"${BUILT_PRODUCTS_DIR}" 
संबंधित मुद्दे

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