Xcode 4 स्टेटिक लाइब्रेरी निर्भरता से सार्वजनिक हेडर फ़ाइलों का पता नहीं लगा सकता है


91

वैकल्पिक शीर्षक खोज की सहायता के लिए

  • Xcode हेडर नहीं मिल सकता है
  • गुम हो गया है। Xcode में
  • Xcode .h फ़ाइल नहीं मिली
  • लेक्सिकल या प्रीप्रोसेसर समस्या फ़ाइल नहीं मिली

मैं एक iOS एप्लिकेशन प्रोजेक्ट पर काम कर रहा हूं जो Xcode 3 से आया है। मैं अब Xcode 4 में चला गया हूं मेरा प्रोजेक्ट कई स्टैटिक लाइब्रेरीज़ का निर्माण करता है।

वे स्टेटिक लाइब्रेरी सार्वजनिक हेडर भी घोषित करते हैं और उन हेडर का उपयोग एप्लिकेशन कोड द्वारा किया जाता है। Xcode 3.x में हेडर को एक बिल्ड चरण के रूप में कॉपी किया गया था public headers directory, फिर एप्लिकेशन प्रोजेक्ट में public headers directoryजोड़ा गया था headers search list

Xcode 4 के तहत बिल्ड डायरेक्टरी में ले जाया जाता है ~/Library/Developer/Xcode/DerivedData/my-project

समस्या यह है कि मैं शीर्ष लेख खोज सेटिंग्स में इस नए स्थान का संदर्भ कैसे दूं? ऐसा लगता है:

  • public headers directoryDerivedDataनिर्देशिका के सापेक्ष है , लेकिन
  • headers search निर्देशिका कुछ और (संभवतः परियोजना स्थान) के सापेक्ष है

मुझे Xcode 4 में iOS के विकास के लिए एक स्थिर पुस्तकालय लक्ष्य कैसे निर्धारित करना चाहिए जो यह सुनिश्चित करेगा कि हेडर फाइलें क्लाइंट के लिए उपलब्ध कराई जाएं जो एक निर्भरता के रूप में संकलित करने का प्रयास करते समय स्थिर पुस्तकालय का उपयोग करें?


पथ नामों से संबंधित हो सकता है। Pl इस पोस्ट की जाँच करें। [Xcode 4 में स्टेटिक लाइब्रेरी] [1] [१]: stackoverflow.com/questions/6074576/static-lbooks-in-xcode-4/…
डिएगो माराफेटी

जवाबों:


124

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

संक्षिप्त उत्तर

अपने उपयोगकर्ता शीर्ष खोज पथ में निम्न पथ जोड़ें

"$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

यह काम क्यों करता है?

सबसे पहले, हमें समस्या को समझने की जरूरत है। सामान्य परिस्थितियों में, जब आप रन, टेस्ट, प्रोफाइल या एनालिसिस कहते हैं, तो Xcode आपके प्रोजेक्ट को बनाता है और आउटपुट को बिल्ड / प्रोडक्ट्स / कॉन्फ़िगरेशन / प्रोडक्ट्स डायरेक्टरी में डालता है , जो $ BUILT_PRODUCT_DOM मैक्रो के माध्यम से उपलब्ध होता है ।

स्थैतिक पुस्तकालयों के बारे में अधिकांश मार्गदर्शिकाएँ सार्वजनिक हेडर फ़ोल्डर पथ को $ TARGET_NAME पर सेट करने की सलाह देती हैं , जिसका अर्थ है कि आपकी लिब फाइल $ BUILT_PRODUCS_DIR /libTargetName.a बन जाती है और आपके शीर्षकों को $ BUILT_PRODUCT_DIR / TargetName में डाल दिया जाता है । जब तक आपके ऐप में $ पथ $ BUILT_PRODUCT_DIR शामिल हैं, तब तक उपरोक्त 4 स्थितियों में आयात कार्य करेगा। हालाँकि, जब आप संग्रह करने का प्रयास करेंगे तो यह काम नहीं करेगा।

संग्रह करना थोड़ा अलग तरीके से काम करता है

जब आप किसी प्रोजेक्ट को संग्रहीत करते हैं, तो Xcode संग्रह के एक अलग फ़ोल्डर का उपयोग करता है, जिसे संग्रहित किया जाता है। उस फ़ोल्डर के भीतर आपको / YourAppName / BuildProductsPath / रिलीज़-iphoneos / मिलेगा। यह वह फ़ोल्डर है, जब आप एक संग्रह करते समय $ BUILT_PRODUCT_DIR को इंगित करते हैं। यदि आप वहां देखते हैं, तो आप देखेंगे कि आपकी निर्मित स्टैटिक लाइब्रेरी फ़ाइल में एक सिमलिंक है, लेकिन हेडर वाला फ़ोल्डर गायब है।

हेडर (और लाइब फाइल) को खोजने के लिए आपको इंटरमीडिएटBildFilesPath / UninstalledProducts / पर जाना होगा। याद रखें जब आपको स्थैतिक पुस्तकालयों के लिए YES पर Skip Install करने के लिए कहा गया था ? वैसे यह वह प्रभाव होता है, जब आप एक आर्काइव बनाते हैं।

साइड नोट: यदि आप इसे इंस्टॉल करने के लिए सेट नहीं करते हैं, तो आपके हेडर को अभी तक किसी अन्य स्थान पर रखा जाएगा और लिब फ़ाइल को आपके संग्रह में कॉपी किया जाएगा, जो आपको .ipa फ़ाइल को निर्यात करने से रोकता है, जिसे आप ऐप स्टोर में जमा कर सकते हैं। ।

बहुत खोज के बाद, मुझे कोई भी मैक्रो नहीं मिल सकता है जो अनइंस्टाल्डप्रोडक्ट्स फ़ोल्डर से मेल खाता है, इसलिए "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" के साथ पथ का निर्माण करने की आवश्यकता है

सारांश

अपनी स्थिर लाइब्रेरी के लिए, सुनिश्चित करें कि आप इंस्टॉल करना छोड़ दें और आपके सार्वजनिक शीर्षकों को $ TARGET_NAME में रखा जाए।

आपके ऐप के लिए, अपने उपयोगकर्ता हेडर खोज पथ को "$ (BUILT_PRODUCS_DIR)" पर सेट करें, जो नियमित बिल्ड के लिए ठीक काम करता है, और "$ (BUILD_ROOT) /../ IntermediateBuildbilesPath / UninstalledProducts", जो संग्रह बनाता है के लिए काम करता है।


यह DerivedData फ़ोल्डर से कैसे संबंधित है?
रिचर्ड स्टेलिंग

नियमित बिल्ड पर जाते हैं: DerivedData / WorkspaceName-hash / Build / Products / Debug-iphoneos / TargetName.app --- पुरालेख बनाता है: DerivedData / WorkspaceName-hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release-iphoneos TargetName.app
कॉलिन

3
मेरे लिए, पुनरावर्ती चेकबॉक्स के साथ "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" का उपयोग नहीं किया। जैसे ही मैंने पुनरावर्ती ध्वज के बिना "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>" का उपयोग किया, इसने मेरे लिए काम किया।
टीपीओशेल

7
ध्यान दें कि आपका $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts वास्तव में है $(TARGET_BUILD_DIR)। संग्रह करते समय भी। ;)
पास्कल

1
मेरे लिए Xcode 5: $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / शामिल हैं / जिनमें से LIBRARY का नाम मैंने YES पर सेट नहीं किया था: हमेशा उपयोगकर्ता आईडी खोजें।
xarly

84

जब मैं अपनी खुद की स्टैटिक लाइब्रेरी विकसित कर रहा था, तब मैं इसी मुद्दे पर आया था और कॉलिन का जवाब बहुत मददगार था, लेकिन मुझे लगातार काम करने के लिए इसे थोड़ा संशोधित करना पड़ा और जब Xcode 4 के तहत रनिंग और आर्काइविंग दोनों प्रोजेक्ट्स में वर्कस्पेस का उपयोग किया गया।

मेरी विधि के बारे में क्या अलग है आप अपने सभी बिल्ड कॉन्फ़िगरेशन के लिए एक एकल उपयोगकर्ता हेडर पथ का उपयोग कर सकते हैं।

मेरी विधि इस प्रकार है:

एक कार्यक्षेत्र बनाएँ

  1. Xcode 4 के तहत, फ़ाइल, नया, कार्यक्षेत्र पर जाएं।
  2. फ़ाइंडर से आप तब .xcodeproj प्रोजेक्ट्स को उन दोनों स्टैटिक लाइब्रेरी के लिए ड्रैग कर सकते हैं, जिनका आप उपयोग करना चाहते हैं, और नया ऐप जो आप बना रहे हैं, वह लाइब्रेरी का उपयोग करता है। कार्यस्थान सेट करने के बारे में अधिक जानकारी के लिए Apple डॉक्स देखें: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

स्टेटिक लाइब्रेरी प्रोजेक्ट सेटिंग्स

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

शामिल / LibraryName

मैंने इसे RestKit के साथ उपयोग से अपनाया है और पाया है कि यह मेरे सभी स्थिर पुस्तकालयों के साथ सबसे अच्छा काम करता है। यह क्या करता है Xcode बताता है कि हम अपने द्वारा निर्दिष्ट फ़ोल्डर में चरण 1 में "सार्वजनिक" हेडर अनुभाग में स्थानांतरित किए गए सभी हेडर को कॉपी करते हैं जो निर्माण के दौरान व्युत्पन्न डेटा फ़ोल्डर के भीतर रहता है। रेस्टकिट के साथ, मुझे पसंद है कि मैं एक परियोजना में उपयोग कर रहे प्रत्येक स्थिर पुस्तकालय को शामिल करने के लिए एक "शामिल" फ़ोल्डर का उपयोग करूं।

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

  1. "इंस्टॉल छोड़ें" ढूंढें और सुनिश्चित करें कि यह हां में सेट है।

स्टेटिक लाइब्रेरी का उपयोग कर प्रोजेक्ट के लिए सेटिंग्स

  1. बिल्ड चरणों के तहत स्टैटिक लाइब्रेरी को एक फ्रेमवर्क के रूप में जोड़ें> लाइब्रेरी के साथ बाइनरी लिंक करें और जो भी स्टैटिक लाइब्रेरी आप उपयोग करना चाहते हैं उसके लिए libLibraryName.a फ़ाइल जोड़ें।
  2. अगला सुनिश्चित करें कि प्रोजेक्ट उपयोगकर्ता खोज पथ के लिए खोज करने के लिए सेट है। यह बिल्ड सेटिंग्स> ऑलवेज सर्च यूजर पाथ के तहत किया जाता है और यह सुनिश्चित करें कि इसका सेट YES में है।
  3. उसी क्षेत्र में उपयोगकर्ता हैडर खोज पथ खोजें और जोड़ें:

    "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / में शामिल हैं"

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

कार्यक्षेत्र को कॉन्फ़िगर करें

यहां हम कार्यक्षेत्र को कॉन्फ़िगर करना चाहते हैं ताकि जब हम अपना ऐप बनाएंगे तो यह स्टैटिक लाइब्रेरी का निर्माण करेगा। यह हमारे ऐप के लिए इस्तेमाल की गई योजना को संपादित करके किया जाता है।

  1. सुनिश्चित करें कि आपके पास चयनित योजना है जो आपका आवेदन बनाएगी।
  2. स्कीम ड्रॉप-डाउन से, एडिट स्कीम चुनें।
  3. बाईं ओर सूची के शीर्ष पर बिल्ड का चयन करें। मध्य फलक पर + दबाकर एक नया लक्ष्य जोड़ें।
  4. जिस लाइब्रेरी को आप लिंक करने की कोशिश कर रहे हैं, उसके लिए आपको स्टैटिक लाइब्रेरी शो देखना चाहिए। IOS स्टैटिक लाइब्रेरी चुनें।
  5. रन और आर्काइव दोनों पर क्लिक करें। जब भी आप अपने ऐप का निर्माण करते हैं तो यह स्टैटिक लाइब्रेरी के लिए पुस्तकालयों को संकलित करने की योजना को बताता है।
  6. अपने एप्लिकेशन लक्ष्य के ऊपर स्थिर लाइब्रेरी खींचें। यह आपके आवेदन लक्ष्य से पहले स्थैतिक पुस्तकालयों को संकलित करता है।

लाइब्रेरी का उपयोग करना शुरू करें

अब, आप का उपयोग कर अपने स्थिर पुस्तकालय आयात करने में सक्षम होना चाहिए

import <LibraryName/LibraryName.h>

यह विधि अलग विन्यास के लिए अलग-अलग उपयोगकर्ता हेडर पथ होने की परेशानी के आसपास हो जाती है, इसलिए आपको अभिलेखागार के लिए संकलन करने में कोई समस्या नहीं होनी चाहिए।

यह काम क्यों करता है?

यह सब इस मार्ग पर निर्भर करता है:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

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


3
तुम कमाल हो यार! यह वास्तव में मददगार है, और यह आपके बताए अनुसार काम करता है।
नीवेक

1
बहुत बढ़िया। मैं फूल कहाँ भेजूँगा :)
रमेश

1
इसे स्थापित करने के बाद, आप में से कुछ का सामना " ...] को गैरकानूनी चयनकर्ता वर्ग 0x ... " पर भेजा जा सकता है । यदि आप ऐसा करते हैं, तो अपने प्रोजेक्ट के लक्ष्य-> प्रोजेक्ट-> बिल्ड सेटिंग्स-> लिंकिंग-> अन्य लिंकर फ्लैग्स : -all_load
MkVal

सुनिश्चित करें कि उपयोगकर्ता हैडर खोज पथ उद्धरण में हैं यदि उनके पास स्थान हैं।
सम्मानTheCode

Xcode 4.6.2 मेरे लिए "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / शामिल" कुछ भी नहीं लिख रहा है। कोई भी विचार जो मुझे याद आ रहा है? या फिर Xcode व्यवहार बदल गया है?
c रोनाल्ड

16

Xcode 4 प्रोजेक्ट एक स्थिर लाइब्रेरी को संकलित करने में विफल रहता है

संबंधित प्रश्न: Xcode 4 में "लेक्सिकल या प्रीप्रोसेसर समस्या फ़ाइल नहीं मिली है"

त्रुटियों में शामिल हो सकते हैं; लापता हेडर फाइलें, "लेक्सिकल या प्रीप्रोसेसर समस्या"

समाधान:

  1. "उपयोगकर्ता शीर्ष लेख पथ" सही हैं की जाँच करें
  2. "हमेशा उपयोगकर्ता पथ खोजें" हां पर सेट करें
  3. अपनी परियोजना में एक समूह कॉल "इंडेक्सिंग हेडर" बनाएं और हेडर को इस समूह में खींचें, संकेत दिए जाने पर कोई लक्ष्य जोड़ें।

11
एक और आसानी से अनदेखी लेकिन अत्यंत महत्वपूर्ण कदम: सुनिश्चित करें कि आपके खोज पथ किसी भी स्थान से बचने के लिए दोहरे उद्धरण चिह्नों में लिपटे हुए हैं। मैं हमेशा ऐसा करना भूल जाता हूं।
ब्रैड

धन्यवाद @ ब्रैड, यह वास्तव में एक बहुत ही महत्वपूर्ण और उपयोगी टिप्पणी है।
जूलियन डी।

15

यह एक बहुत ही उपयोगी धागा था। अपनी खुद की स्थिति के लिए शोध में, मैंने पाया कि Apple का सितंबर 2012 में 12 पृष्ठों वाला एक दस्तावेज़ है, जिसका शीर्षक है "iOS में स्टेटिक लाइब्रेरीज़ का उपयोग करना।" यहाँ पीडीएफ लिंक दिया गया है: http://developer.apple.com/library/ios/technotes/iOSStaticLbooks/iOSStaticLbooks.pdf

यह अधिकांश इंटरनेट चर्चा की तुलना में बहुत सरल है, और कुछ छोटे मॉड्स के साथ खाते के लिए कि बाहरी पुस्तकालयों को मैं कैसे कॉन्फ़िगर कर रहा हूं, यह मेरे लिए अच्छा काम कर रहा है। सबसे महत्वपूर्ण हिस्सा शायद है:

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

Xcode 4.4 के साथ या बाद में बनाए गए नए स्थिर पुस्तकालय लक्ष्य हेडर के लिए उचित रूप से कॉन्फ़िगर की गई कॉपी फ़ाइल्स चरण के साथ आएंगे, इसलिए आपको यह देखने के लिए देखना चाहिए कि क्या आपके पास एक बनाने से पहले ही एक है। यदि आप नहीं करते हैं, तो लक्ष्य संपादक के निचले भाग में "चरण बनाएँ चरण जोड़ें" और "प्रतिलिपि फ़ाइलें जोड़ें" चुनें। नई प्रतिलिपि फ़ाइलों का निर्माण चरण का खुलासा करें और गंतव्य को "उत्पाद निर्देशिका" पर सेट करें। {PRODUCT_NAME} को शामिल करने के लिए उपपथ सेट करें। यह आपके लाइब्रेरी के नाम पर एक फ़ोल्डर में फ़ाइलों की प्रतिलिपि करेगा (PRODUCT_NAME बिल्ड सेटिंग से लिया गया), आपके द्वारा निर्मित उत्पादों निर्देशिका के अंदर, शामिल नाम के एक फ़ोल्डर के अंदर। बिल्ड उत्पादों निर्देशिका के अंदर फ़ोल्डर शामिल करें अनुप्रयोगों के लिए डिफ़ॉल्ट हेडर खोज पथ में है, इसलिए हेडर फ़ाइलों को डालने के लिए यह एक उपयुक्त स्थान है।

मुझे यकीन है कि कई मौजूदा स्थितियों में Apple का दृष्टिकोण पर्याप्त नहीं हो सकता है। मैं इसे यहां किसी के लिए पोस्ट करता हूं जो सिर्फ स्थैतिक पुस्तकालय उद्यान पथ पर अपनी यात्रा शुरू कर रहा है - यह सरल मामलों के लिए सबसे अच्छा शुरुआती बिंदु हो सकता है।


उपरोक्त लिंक का अनुसरण करने वालों के लिए .. सावधान रहें: वह चरण जो आपको लाइब्रेरी प्रोजेक्ट बनाते समय डमी टेम्पलेट फ़ाइलों को हटाने के लिए कहता है .. डन न करें * .pch फ़ाइल .. यह आपको अंततः + ऊपर लाने के लिए आएगा। सलाह श्रेणियों साथ काम नहीं करता .. कि हालांकि के लिए एक फ़िक्स (इसे कहीं देखा) है
abbood

स्थैतिक पुस्तकालयों के निर्माण के लिए एक आधिकारिक ऐप्पल दृष्टिकोण के लिए एक लिंक प्रदान करने के लिए धन्यवाद। मैंने इस दृष्टिकोण का उपयोग करके अपने स्थिर पुस्तकालय का निर्माण शुरू किया , लेकिन पुरालेख में असमर्थ था। @abbood - उत्पन्न होने वाली pch फ़ाइल को हटाने में क्या समस्या है?
एलेस्टो केलेजस

यदि आप .pch फ़ाइल को हटाते हैं .. तो परियोजना केवल संकलन नहीं करेगी .. (संग्रह या अन्यथा के उद्देश्य से) ..
7

यह मेरे लिए काम नहीं करता है। जब मैं आयात कथन की कोशिश करता हूं तो "" मुझे यह काम नहीं करना चाहिए <>। साथ ही इसे संग्रहित करते समय शीर्ष लेख खोजने में सक्षम नहीं है। किसी भी विचार?
user1010819 12

4

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

प्रति Apple दस्तावेज़:

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


3

एक अंतर्दृष्टि के लिए जोनाह व्लायम के समाधान (मध्य मार्ग नीचे) और गिटहब मॉडल (टिप्पणियों में) पर एक नज़र डालें। http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/


4
हालांकि यह तकनीकी रूप से सवाल का जवाब कर सकते हैं, यह बेहतर होगा यदि आप अपना उत्तर में जुड़े हुए लेख के आवश्यक हिस्से शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करने के लिए। ऐसा करने में असफल रहने से लिंक सड़ने का खतरा पैदा हो जाता है।
jscs

2

$ (OBJROOT) / UninstalledProducts / exactPathToHeaders को Header Search Path में जोड़ें

किसी कारण के लिए पुनरावर्ती चेकबॉक्स मेरे लिए काम नहीं करता था और मुझे हेडर स्थित हैं, जहां से बाकी का रास्ता जोड़ना पड़ता था।

Xcode में लॉग नेविगेटर के तहत (ब्रेक पॉइंट नेविगेटर के दाईं ओर टैब) आप बिल्ड इतिहास देख सकते हैं। यदि आप वास्तविक बिल्ड विफलता का चयन करते हैं, तो आप सेटेन पेट को देखने के लिए इसके विवरण का विस्तार कर सकते हैं और यह सुनिश्चित करने के लिए जांच कर सकते हैं कि आपकी हेडर फ़ाइलों का मार्ग क्या है।


पुनरावर्ती चेकबॉक्स पर अच्छा नोट, यहाँ भी यही समस्या है।
कोडेजी

हां, मुझे एक विशेष उप-फ़ोल्डर भी निर्दिष्ट करना था, पुनरावर्ती काम नहीं कर रहा था।
ओलिवर पियरमैन

हालाँकि मैंने इस रास्ते का उपयोग किया (केवल इसलिए कि इसका छोटा) "$ (PROJECT_TEMP_DIR) /../ अनइंस्टाल्डप्रोडक्ट्स / सबप्रोजेक्टहेडर्स"
ओलिवर

2

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


1

अपने उपयोगकर्ता हैडर खोज पथ के लिए निम्न पथ जोड़ें to

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

यह सत्यापित है!


1

यह दिखाने के जोखिम में कि मैं क्या बेवकूफ हूँ ... मैं XCode से पीड़ित हूँ। मेरी सारी दोपहर .h फाइलें खोजने के लिए।

तब मुझे एहसास हुआ।

क्योंकि मैं "XCode 4" का उपयोग कर रहा था, मैंने "समझदारी से" अपनी सभी परियोजनाओं को " XCode 4 प्रोजेक्ट्स " नामक एक फ़ोल्डर के सबफ़ोल्डर में डालने का निर्णय लिया था ।

फ़ोल्डर नाम के उन स्थानों ने XCode को बड़े समय तक गड़बड़ कर दिया!

इस फ़ोल्डर का नाम बदलकर " XCode_4_Projects " ने मेरे जीवन में खुशी (और कम शपथ ग्रहण) ला दी है।

मुझे फिर से याद दिलाएं, यह कौन सा साल है?

शायद कोई Apple डेवलपर्स को बता सकता है ...


1

इनमें से किसी भी जवाब ने मेरे लिए काम नहीं किया। यहाँ क्या किया है। अपने उपयोगकर्ता हैडर खोज पथ निर्माण सेटिंग में निम्नलिखित बिल्कुल (दोहरे उद्धरण सहित कॉपी और पेस्ट) जोड़ें :

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

अन्य उत्तरों की तुलना में "/ शामिल /" उपनिर्देशिका के अलावा पर ध्यान दें। जैसा कि अन्य उपयोगकर्ताओं ने बताया है, "पुनरावर्ती" विकल्प कुछ भी नहीं लगता है, इसलिए आप इसे अनदेखा कर सकते हैं।

निम्नलिखित रूप में स्थिर लाइब्रेरी हेडर फ़ाइलों को आयात करते समय मेरी परियोजना अब सफलतापूर्वक संग्रहित करने में सक्षम थी:

#import "LibraryName/HeaderFile.h"

आप करते नहीं सक्षम करने की आवश्यकता हमेशा खोज उपयोगकर्ता पथ जब तक आप कोण कोष्ठक (अपने स्थायी पुस्तकालय हेडर शामिल कर रहे हैं की स्थापना #import <LibraryName/HeaderFile.h>), लेकिन क्या तुम सच में इसे उस तरह से वैसे भी नहीं करना चाहिए अगर यह एक प्रणाली / ढांचे हैडर नहीं है।


1

ऊपर दिए गए किसी भी उत्तर ने मेरे लिए Xcode 7 पर काम नहीं किया लेकिन उन्होंने मुझे एक अच्छा विचार दिया। Xcode 7 पर संघर्ष करने वाले लोगों के लिए, मैंने उपयोगकर्ता हैडर खोज पथ (उद्धरण शामिल करें) में निम्न जोड़कर इसे ठीक किया

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

usr/local/include'पब्लिक हैडर फोल्डर पाथ' में स्टैटिक लाइब्रेरी की सेटिंग के अनुसार संबंधित URL भाग को बदलें


0

यह एक संबंधित मुद्दा है जिसने मुझे इस प्रश्न के लिए प्रेरित किया है इसलिए मैं प्रलेखन के लिए अपने समाधान को सख्ती से जोड़ रहा हूं / यह पसीने की एक और आत्मा घंटे बचा सकता है

DropboxSDK.h फ़ाइल नहीं मिली

IES के लिए संकलन करने के लिए वीईएस प्राप्त करने की कोशिश करने के दिनों के बाद मैं अंततः इस मुद्दे पर भाग गया। DropboxSDK.hपहुंच में निश्चित रूप से था की search headersमैं भी में जोड़ा framework headersखोज पथ, included .hसीधे और हद के सभी प्रकार के लिए गया था की कोशिश करने और मिल DropboxSDK.hपाया।

उपाय

विशिष्टताDropboxSDK.framework फ़ाइल को Xcode में खींचें Project Navigationऔर सुनिश्चित करें Copy Files if neededकि जाँच की गई है। यह भी सुनिश्चित करें कि आपके लक्ष्य को आवश्यकतानुसार जाँच लिया गया है।

चेतावनी

build phasesमेरे लिए काम नहीं किया स्पष्ट रूपरेखा स्थान निर्धारित करना । मुझे Xcode में .framework को खींचना था और यह सुनिश्चित करना था कि मेरे प्रोजेक्ट में कॉपी की गई फाइलें हैं।

# mbp2015 # xcode7 # ios9


0

ऐसा करने के लिए विभिन्न जटिल तरीके हैं, और इस धागे में कुछ बहुत ही स्मार्ट समाधान प्रस्तावित हैं।

इन सभी समाधानों की मुख्य समस्या यह है कि यह आपके पुस्तकालय पोर्टेबिलिटी को गंभीरता से कम करता है।

  • हर बार जब आपको अपने पुस्तकालय का उपयोग करके एक नई परियोजना शुरू करने की आवश्यकता होती है और इसे iTunes के लिए संग्रहित किया जाता है, तो यह एक कॉन्फ़िगरेशन नर्क है।
  • हर बार जब आपको अपनी परियोजना को अपनी टीम या ग्राहकों के साथ साझा करने की आवश्यकता होती है, तो यह किसी भी कारण (संदर्भ, Xcode संस्करण, जो भी हो, ..) के लिए टूट सकता है।

मेरी पसंद अंततः फ्रेमवर्क का उपयोग करने के लिए अंततः रही है - हमेशा - जैसा कि Apple (WWDC वीडियो) द्वारा अनुशंसित है।

यह इतना आसान है और अंत में एक ही काम करता है!

काम करने के लिए लगता है कि एक और सुंदर समाधान निजी Cocoapods का उपयोग करने के लिए है। Cocoapods सभी विन्यास कार्य, हेडर कॉपी और इसी तरह करता है।

फ्रेमवर्क रॉक!


1
आप इसे कहां सेट करते हैं? simply use frameworks - always -
नील फॉकनर

यह कहीं सेट नहीं है। यह बस एक वास्तुशिल्प पसंद है। चौखटे 'आधुनिक पुस्तकालय' हैं जिन्हें लिंक करना और प्रबंधित करना बहुत आसान है। इस संदेश के समय, स्विफ्ट अभी भी बाइनरी लाइब्रेरी बनाने की अनुमति नहीं देता है।
Moose

0

यहाँ वही है जो मेरे लिए एक ही समस्या का हल है।

मेरे पास एक App Target और एक iMessage Extension Target है। तब मेरे पास 2 एसडीके (मेरे अपने) थे, जिनके खिलाफ ऐप टारगेट लिंक था।

समस्या यह थी: मेरा iMessage लक्ष्य भी मेरा 2 SDK (अलग प्रोजेक्ट्स) का उपयोग कर रहा था, लेकिन यह उनके खिलाफ बिल्ड चरणों में लिंक नहीं कर रहा था -> लिंक बाइनरी विद लाइब्रेरीज़। मुझे अपने 2 एसडीके को iMessage टारगेट में जोड़ना था, अपने ऐप लक्ष्य से मेल खाने के लिए, और अब यह अभिलेखागार है।

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


0

अपडेट: Xcode 9

उपरोक्त उत्तर मेरे लिए Xcode 9 का उपयोग करके काम नहीं किया, लेकिन इस उत्तर ने मेरे लिए पूरी तरह से काम किया। मैंने $(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/includeअपने "हेडर सर्च पाथ्स" में जोड़ा है और एक्सकोड ने मेरी स्थिर लाइब्रेरी के हेडर को बिना किसी समस्या के लिंक किया है।


-18

अपने आप को मुसीबत से बचाएं और ऐसा करें = अपने मैक पर नया उपयोगकर्ता खाता बनाएं - नए उपयोगकर्ता खाते के तहत परियोजना खोलें - सभी समस्याएं गायब हो जाएं। अपना समय बचाएं और अपनी पवित्रता बनाए रखें। उन सभी शून्य उत्तर मदद नहीं करते !!

शुभ लाभ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.