Xcode 5 और iOS 7: आर्किटेक्चर और वैलिड आर्किटेक्चर


82

मैं Xcode 5 में नई परियोजना शुरू कर रहा हूं। मैं iOS SDK 7तैनाती लक्ष्य के साथ प्रयोग करके आवेदन विकसित करना चाहता हूं iOS 5.0। जैसे ही मैं Xcode में नया प्रोजेक्ट बनाता हूं और तैनाती लक्ष्य को 5.0 में बदलने का प्रयास करता हूं, मुझे यह संदेश मिल गया है:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

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

क्या अंतर है ? अगर मैं 64-बिट को बाहर करने के लिए सेट करता हूं तो क्या होता है जब मैं अपने ऐप को 64-बिट आईफोन या आईओएस सिम्युलेटर पर चलाता हूं (मुझे पता है कि यह काम करता है, मैं बस उत्सुक हूं कि नीचे क्या है)? क्या आप नए 64-बिट आर्किटेक्चर के साथ बड़ी गड़बड़ समझा सकते हैं?ArchitecturesValid architectures
Architectures

यहां छवि विवरण दर्ज करें


क्या आपने Apple डेवलपर फ़ोरम पर ध्यान दिया है? इसके बारे में बहुत सारी पोस्ट हैं। devforums.apple.com/message/887506#887506
trojanfoe

जवाबों:


123

मानक आर्किटेक्चर (armv7, armv7s) के निर्माण में आर्किटेक्चर सेट करें

यहां छवि विवरण दर्ज करें

iPhone 5S A7 64bit प्रोसेसर द्वारा संचालित है। से सेब डॉक्स

Xcode में 32-बिट और 64-बिट बायनेरिज़ दोनों के साथ अपना ऐप बना सकते हैं। इस संयुक्त बाइनरी को iOS 7 या बाद के न्यूनतम तैनाती लक्ष्य की आवश्यकता होती है।

नोट: Xcode का एक भविष्य का संस्करण आपको एक एकल ऐप बनाने देगा जो iOS 6 और बाद में 32-बिट रनटाइम का समर्थन करता है, और जो iOS 7 पर 64-बिट रनटाइम का समर्थन करता है।

प्रलेखन से जो मुझे समझ में आया है

  • Xcode एक ही ऐप के लिए 64 बिट 32 बिट बायनेरिज़ दोनों बना सकता है लेकिन तैनाती लक्ष्य iOS7 होना चाहिए। वे कह रहे हैं भविष्य में यह iOS 6.0 होगा
  • 32 बिट बाइनरी iPhone 5S (64 बिट प्रोसेसर) में ठीक काम करेगा।

अपडेट (Xcode 5.0.1)
Xcode 5.0.1 में उन्होंने iOS 5.1.1 के लिए 64 बिट बाइनरी बनाने के लिए समर्थन जोड़ा।

Xcode 5.0.1 32-बिट और 64-बिट बायनेरिज़ दोनों के साथ आपके ऐप का निर्माण कर सकता है। इस संयुक्त बाइनरी को iOS 5.1.1 या बाद के न्यूनतम तैनाती लक्ष्य की आवश्यकता होती है। 64-बिट बाइनरी केवल आईओएस 7.0.3 और बाद में चलने वाले 64-बिट उपकरणों पर चलती है।

अपडेट (Xcode 5.1)
Xcode 5.1 ने आर्किटेक्चर सेक्शन में महत्वपूर्ण बदलाव किया। यह जवाब आपके लिए फॉलोअप होगा। इसे देखो


जैसा कि मैंने अपने प्रश्न में लिखा है, मैंने पहले ही कर लिया है। मेरा प्रश्न अधिक है कि यह क्या बदलता है और क्या होता है।
पागल दही

के बारे में संपादित करें: तो यह सिर्फ बायनेरिज़ के बारे में है? आर्किटेक्चर के साथ 64-बिट को बाहर करने के लिए, iPhone 5S 32-बिट बाइनरी चलाएगा?
क्रेजी योगर्ट

संपादन के बारे में: मुझे लगता है कि न्यूनतम तैनाती लक्ष्य iOS 6.0 होना चाहिए, iOS 7.0 नहीं। @CrazyYoghurt हाँ, जैसा कि मैक के साथ - 64-बिट मशीनें 32-बिट बायनेरिज़ को चला सकती हैं, और 64-बिट मशीन को पहली बार पेश किए जाने पर चलाने के लिए कुछ भी नहीं होगा।
ट्रोजनफो

वर्तमान में iOS 7 परिनियोजन लक्ष्य के साथ 5s और अन्य उपकरणों पर ऐप को काम करने के लिए iOS 7.0 होना चाहिए
अनिल वर्गीस

3
@CrazyYoghurt तो आपको छोड़ना ही होगा arm64
ट्रोजनफो

9

Apple डॉक्स से मेरी समझ।

  • Xcode बिल्ड-सेटिंग्स में आर्किटेक्चर (ARCHS) क्या है ?
    • आर्किटेक्चर / एस निर्दिष्ट करता है जिससे बाइनरी को टारगेट किया गया है । जब एक आर्किटेक्चर को अधिक निर्दिष्ट किया जाता है, तो उत्पन्न बाइनरी में प्रत्येक निर्दिष्ट आर्किटेक्चर के लिए ऑब्जेक्ट कोड हो सकता है।
  • Xcode बिल्ड-सेटिंग्स में वैध आर्किटेक्चर (VALID_ARCHS) क्या है ?

    • आर्किटेक्चर / एस निर्दिष्ट करता है जिसके लिए बाइनरी बिल्ड हो सकता है ।
    • निर्माण प्रक्रिया के दौरान, यह सूची ARCHS के साथ प्रतिच्छेदित होती है और परिणामी सूची उन आर्किटेक्चर को निर्दिष्ट करती है जिन पर बाइनरी चल सकती है।
  • उदाहरण: - एक iOS प्रोजेक्ट में Xcode में बिल्ड-सेटिंग्स निम्नलिखित हैं।

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • इस मामले में, armv7 armv7s arm64 आर्किटेक्चर के लिए बाइनरी बनाया जाएगा। लेकिन एक ही बाइनरी केवल ARCHS = armv7 armv7s पर चलेगी।

9
नहींं, अभी भी नरक से मुझे भ्रमित करता है: S
Ade

"परिणामी सूची" क्या है ??
दनमोर

@DanMoore सेट चौराहे का परिणाम है ।
स्लिप डी। थॉम्पसन

2
यह समझ में आता है कि अगर मुझे एक कारण मिल सकता है कि मैं एक वास्तुकला के लिए निर्माण क्यों करूं, जिसे मैं नहीं चलाना चाहता।
रोब ५४०

6

जब आप 64-बिट सेट करते हैं तो परिणामस्वरूप बाइनरी एक "फैट" बाइनरी होती है, जिसमें पतली वसा हेडर के साथ बंडल किए गए सभी तीन मच-ओ चित्र होते हैं। आप देख सकते हैं कि ओटूल या जटूल का उपयोग करना। आप iOS 7.0 एसडीके के भाग के रूप में शामिल कुछ वसा बायनेरिज़ की जांच कर सकते हैं, उदाहरण के लिए एवीफ़ाउंडेशन फ्रेमवर्क, जैसे:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

बाइनरी के लिए ही, यह ARM64 बिट इंस्ट्रक्शन सेट का उपयोग करता है, जो कि (ज्यादातर 32-बिट के साथ संगत है, लेकिन) पूरी तरह से अलग इंस्ट्रक्शन सेट है। यह ग्राफिक्स प्रोग्राम (नीयन निर्देशों और रजिस्टरों का उपयोग करके) के लिए विशेष रूप से महत्वपूर्ण है। इसी तरह, सीपीयू में अधिक रजिस्टर होते हैं, जो प्रोग्राम की गति पर काफी प्रभाव डालता है। Http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons में एक दिलचस्प चर्चा है कि क्या इससे कोई फर्क पड़ता है या नहीं; बेंचमार्किंग परीक्षणों ने अब तक स्पष्ट रूप से संकेत दिया है कि यह करता है।

ओटूल -tV का उपयोग विधानसभा को डुबो देगा (यदि आपके पास एक्सकोड 5 और बाद में है), और फिर आप निर्देश सेट को अपने बीच अंतर देख सकते हैं। अधिकांश (लेकिन सभी नहीं) डेवलपर्स परिवर्तनों के लिए अज्ञेय बने रहेंगे, क्योंकि अधिकांश भाग के लिए वे ओबज-सी (सीजी * एपीआई के बावजूद) को सीधे प्रभावित नहीं करते हैं, और निम्न स्तर के सूचक हैंडलिंग के साथ अधिक करना है। संकलक अपने जादू और अनुकूलन का काम करेगा।


6

समर्थित आर्किटेक्चर से arm64 सेटिंग को हटाकर आपको अपने कंपाइलर को केवल armv7 और armv7 तक सीमित करने की आवश्यकता नहीं है । आपको केवल 5.1.1 पर परिनियोजन लक्ष्य सेटिंग सेट करने की आवश्यकता है

महत्वपूर्ण नोट: आप सेटिंग लक्ष्य अनुभाग में 5.1.1 पर परिनियोजन लक्ष्य सेट नहीं कर सकते क्योंकि यह केवल निश्चित मानों के साथ ड्रॉप-डाउन है। लेकिन आप इसे आसानी से टेक्स्ट फील्ड में वैल्यू टाइप करके एप्लिकेशन सेटिंग्स के जनरल सेक्शन में 5.1.1 पर सेट कर सकते हैं ।


5

सरल तय:

लक्ष्य -> ​​बिल्ड सेटिंग्स -> बिल्ड विकल्प -> बिटकोड सक्षम करें -> नहीं

IOS 9.3.3 के साथ डिवाइस पर काम करता है


4

किसी भी उत्तर ने काम नहीं किया और फिर मैं न्यूनतम परिनियोजन लक्ष्य निर्धारित करना भूल रहा था जो परियोजना में पाया जा सकता है -> सामान्य -> तैनाती की जानकारी -> तैनाती लक्ष्य -> 8.0

उदाहरण

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