iphone - फ़ाइल संग्रह के लिए बनाई गई थी जो वास्तुकला से जुड़ी नहीं है(i386)




ios ipad (6)

मुझे स्थिर पुस्तकालय बनाना है। मैं अपने आईफोन और आईपैड ऐप में उपयोग करना चाहता हूं। जब मैं सिम्युलेटर चलाने की कोशिश करता हूं तो मुझे गलती मिलती है। मैं आईओएस विकास के लिए नया हूँ। कृप्या सहायता करे;

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

मैंने वास्तुकला में i386 जोड़ने की कोशिश की। लेकिन कोई भाग्य नहीं है


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

lipo -info libnetUtils.a

यह i386, armv6, armv7, armv7s, x86_64 इत्यादि को मुद्रित करेगा। सामान्यतः, उस आर्किटेक्चर को आपके लक्ष्य निर्माण प्लेटफ़ॉर्म से मेल खाना पड़ेगा। उदाहरण के लिए

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

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

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


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

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

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


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


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

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

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

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


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

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

अगर मैं कप्तान स्पष्ट हूं तो मेरा न्याय मत करो :)


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







ipad