फ़ाइल को आर्काइव के लिए बनाया गया था जो कि आर्किटेक्चर से जुड़ा नहीं है (i386)


79

मुझे स्टैटिक लाइब्रेरी बनाने का मौका मिला। मैं अपने iPhone और iPad ऐप में उपयोग करना चाहता हूं। जब मैं सिम्युलेटर चलाने की कोशिश करता हूं तो मुझे गलत लिंकिंग मिलते हैं। मैं iOS के विकास में नया हूं। कृप्या सहायता करे;

ld: चेतावनी: फ़ाइल /Users/valuelabs/Desktop/DruvaProject/lbooks/libnetUtils.a को अनदेखा करते हुए, फ़ाइल को संग्रह के लिए बनाया गया था जो वास्तुकला से जुड़ा नहीं है (i386) वास्तुकला के लिए
अनिश्चित प्रतीक i386: "_OBJC_CLASS _ $ _ netUtils", का संदर्भ दिया गया है। ViewController.o ld: objc-class-ref में: आर्किटेक्चर i386 क्लैंग के लिए प्रतीक (नों) नहीं मिला: त्रुटि: एग्ज़िट कोड 1 के साथ लिंकर कमांड विफल रहा (उपयोग -विवरण देखने के लिए)

मैंने आर्किटेक्चर में i386 को जोड़ने की कोशिश की। लेकिन कोई किस्मत नहीं

जवाबों:


77

इसी समस्या से जूझने और बिल्ड सेटिंग्स को अपडेट करने के सभी स्वीकृत उत्तरों का अनुसरण करने के बाद, लिंकर सर्च पाथ को क्लियर करने आदि। मैंने आखिरकार एक जवाब खोज लिया जो मेरे लिए काम कर गया।

निर्माण से पहले, सुनिश्चित करें कि आप iOS डिवाइस के बजाय सही प्रकार (iPhone सिम्युलेटर) का चयन करें। फिर पुनर्निर्माण। अन्यथा, आप अपने मैक (i386) पर एक सिम्युलेटर पर एक iOS डिवाइस (आर्म प्रोसेसर) के लिए निर्मित लाइब्रेरी का उपयोग करने की कोशिश कर रहे हैं। स्पष्ट होना चाहिए था, लेकिन नहीं था।

इससे पहले:

iOS डिवाइस सेटिंग्स

उपरांत:

iPhone 5.1 सिम्युलेटर सेटिंग्स

अब, नेविगेटर में उत्पाद समूह में देखें> अपनी स्थिर लाइब्रेरी (.a फ़ाइल) पर क्लिक करें> फ़ाइंडर में दिखाएं, आप देखेंगे कि डिबग-आईफ़ोन के बजाय डीबग-आईफ़ोनह्युलेटर फ़ोल्डर में है। मैंने मूल रूप से फ़ोल्डर के नाम पर कोई ध्यान नहीं दिया, या हो सकता है कि मैंने इस बारे में सोचा हो।

उम्मीद है की यह मदद करेगा।


इससे मेरे लिए हल हो गया। आर्किटेक्चर के निर्माण के लिए कई तरीके हैं जिनका आप इरादा नहीं कर रहे हैं और भविष्य के खोजकर्ता इनमें से कई उत्तरों को देखना चाहेंगे, यदि आप उस पर आते हैं जो आप पर लागू होता है!
डैनी

अपडेट: Xcode 5 और iPhone 64-बिट सिम्युलेटर के बाद, मुझे एक और आर्किटेक्चर के लिए libPods.a बनाया जा रहा है, लेकिन यह अन्य प्रकार के सिमुलेटर में नहीं होता है: \
Nour1991

13
@ Nour1991 कोशिश की स्थापना Build Settings -> Build Active Architecture Onlyकरने के लिएNo
MMiroslav

@Miroslav मुझे इसे हां में डालना था, क्योंकि मुझे डिबग में तैनात करने की आवश्यकता है।
पेड्रो रोमियो

42

कभी-कभी इस प्रकार की त्रुटियां आपको परेशान करती हैं!

मेरे लिए व्युत्पन्न डेटा कार्य निकालना:

ठीक करने के उपाय

1) XCODE में> Windows> प्रोजेक्ट> अपनी परियोजना का चयन करें> व्युत्पन्न डेटा हटाएं> XCODE से बाहर निकलें और इसे फिर से खोलें> यदि आपको MAC-O-Linker निर्मित विफल हुई त्रुटि मिल गई है> इस लिंक को फिर से साफ़ करें> फिर से बनाएँ और बनाएँ।


1
XCode 8 में व्युत्पन्न डेटा को हटाने के लिए, यहाँ देखें: stackoverflow.com/questions/38016143/…
Dan Carlson

28

libnetUtils.aआपके लक्ष्य से अलग वास्तुकला के लिए आपका निर्माण किया जा रहा है।

LibnetUtils निर्माण सेटिंग्स की जाँच करें। यह जिस आर्किटेक्चर के लिए बनाया जा रहा है और इसके समर्थित आर्किटेक्चर की सूची आपके लक्ष्य के आर्किटेक्चर का एक (कमजोर) सुपरसेट होना चाहिए। यहां जटिलता यह है कि परिणामस्वरूप वास्तुकला विभिन्न सेटिंग्स में फैली हुई है: "आर्किटेक्चर", "केवल सक्रिय वास्तुकला का निर्माण करें" और "वैध वास्तुकला"।

"केवल सक्रिय वास्तुकला का निर्माण करें" सेटिंग्स इसे विशेष रूप से भ्रमित करती हैं। उदाहरण के लिए, मान लीजिए कि आप सिम्युलेटर के लिए निर्माण कर रहे हैं। यदि डीबग के लिए "केवल बिल्ड आर्किटेक्चर सक्रिय करें" सेटिंग NO पर सेट है, तो यह "आर्किटेक्चर" और "मान्य आर्किटेक्चर" (शायद armv7, आदि) में सूचीबद्ध सभी आर्किटेक्चर का निर्माण करेगा। लेकिन अगर libnetUtils में वह सेटिंग यस (डीबग: यस) के लिए सेट है, तो यह केवल i386 के लिए बन रही है। इसलिए जब आपका लिंकर arm37 को i386 के साथ जोड़ने की कोशिश करता है, तो यह विफल हो जाता है।


26

यदि मुझे अनदेखा फ़ाइल चेतावनी मिलती है - मैं lipo -infoइसे नीचे की तरह आर्किटेक्चर खोजने के लिए अनदेखा फ़ाइल पर चलाऊंगा

lipo -info libnetUtils.a

यह या तो i386, armv6, armv7, armv7s, x86_64 आदि को प्रिंट करेगा, सामान्य तौर पर, उस आर्किटेक्चर को आपके टारगेट बिल्ड प्लेटफॉर्म के साथ मैच करना होगा। उदाहरण के लिए

  • i386 = ios सिम्युलेटर या मैक ओएस एक्स पर 32 बिट बिल्ड
  • armv6 armv7 arm7s = ios डिवाइस
  • x86_64 = मैक ओएस एक्स पर 64 बिट बिल्ड

बेमेल के आधार पर, या तो आपको अपने लक्ष्य प्लेटफ़ॉर्म के लिए अपनी लाइब्रेरी को फिर से बनाना होगा या अपना लक्ष्य प्लेटफ़ॉर्म बदलना होगा।

नोट: वसा बायनेरिज़ के लिए, lipo -infoऊपर के आर्किटेक्चर के संयोजन को प्रिंट करेगा।


2
हालांकि, इसने ओपी का जवाब नहीं दिया। यह इस समस्या को डीबग करने के लिए एक महान उपकरण है। मैं जानना चाहता हूं कि आप उपरोक्त सभी आर्किटेक्चर के साथ एक द्विआधारी कैसे बना सकते हैं?
जे। क्यू।

कोई बात नहीं, मुझे यहाँ जवाब मिला: stackoverflow.com/questions/2793392/… जो 'संयोजन के लिए लाइपो का उपयोग करता है -क्रीट' ध्वज का उपयोग करता है
Jay Q.

ld: चेतावनी: iOS-armv7 के लिए निर्माण लेकिन iOS-arm64 के लिए निर्मित फ़ाइल के साथ लिंक करने का प्रयास आर्किटेक्चर armv7 के लिए अपरिभाषित प्रतीक । यदि आप स्वयं लाइब्रेरी / फ्रेमवर्क का उपयोग कर रहे हैं तो इसे प्रोजेक्ट लाइब्रेरी और एडॉप्टर दोनों में बदल दें। बिल्ड सेटिंग्स -> बिल्ड एक्टिव आर्किटेक्चर केवल नहीं
श्रीकांत फड़के


9

मुझे नहीं पता कि मेरी सलाह सही है या नहीं, लेकिन यह जाँचने का प्रयास करें:

  • अपने प्रोजेक्ट का चयन करें
  • "सेटिंग बनाएँ" चुनें
  • चेक आर्किटेक्चर:
    • मान्य आर्किटेक्चर होना चाहिए "armv6 armv7"
    • समर्थित प्लेटफ़ॉर्म "iphonesimulator iphoneos" होना चाहिए (शायद iPad, मुझे नहीं पता)
    • बेस एसडीके - आपका आईओएस एसडीके (मेरे पास आईओएस 5.0 है)।

अगर मैं स्पष्ट कप्तान हूं तो मुझे मत आंकिए :)


17
अलेक्जेंडर की सलाह के अलावा, मैं आपको सलाह दूंगा कि 'बिल्ड एक्टिव आर्किटेक्चर ओनली' सेटिंग 'NO' पर सेट करें। इसने मुझे हाल ही में उलझा दिया।
TPoschel

5

इसका मतलब है कि आप जिस पुस्तकालय का उपयोग करने की कोशिश कर रहे हैं, वह आईओएस सिम्युलेटर (i386 प्रतीक मैक के लिए) के लिए सार्वभौमिक रूप से संकलित नहीं था। वास्तविक डिवाइस पर इसे चलाने पर ठीक काम करना चाहिए।


3

एक ही समस्या थी, और बिना किसी लाभ के पेज से विविध समाधानों की कोशिश की। मेरे पास अभी भी एक संदेश था जो मुझे बता रहा था कि मेरी लाइब्रेरी arm64 के लिए नहीं बनाई गई थी।

अंत में मैंने इसे कैसे हल किया:

  • एक पाठ संपादक में पुस्तकालय के लिए project.pbxproj खोला
  • VALID_ARCHS के लिए खोज की गई
  • 4 घटनाएं हुईं, जिनमें से 2 में arm64 नहीं थी
  • मैंने श्रृंखला में मैन्युअल रूप से arm64 जोड़ा (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • लिबास को फिर से बनाना और यह सब ठीक था

कभी-कभी लगता है कि XCode द्वारा प्रदर्शित बिल्ड सेटिंग्स अधूरी हैं, और यह प्रोजेक्ट फ़ाइल के अनुरूप नहीं है।


3

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


इस सवाल पर अन्य सभी सुझावों की जाँच की, यह वह था जिसने मुझे
उलझा

0

मेरे लिए यह तय किया गया था की स्थापना Build Active Architecture Onlyकरने के लिए Multiple values, ऐसा करने के लिए, आप इसे और सेट का विस्तार करने के लिए है Debugकरने के लिए YESऔर Releaseकरने के लिए No। और अब, यह मेरे डिवाइस पर संकलित करता है।



-2

मेरे पास armv7s की वास्तुकला भी थी। मैंने इसे हटा दिया और सुनिश्चित किया कि armv6 और armv7 केवल दो सूचीबद्ध थे। यह अब काम करता है


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