Xcode 5 ve iOS 7: Mimari ve Geçerli mimariler


82

Xcode 5'te yeni bir projeye başlıyorum . iOS SDK 7Dağıtım hedefini kullanarak uygulama geliştirmek istiyorum iOS 5.0. Xcode'da yeni proje oluşturup dağıtım hedefini 5.0 olarak değiştirmeye çalıştığım anda şu mesajı alıyorum:

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.

Böylece mimariler Standard(64bit yok) olarak değiştirildi. Derlerim, çalıştırırım ama ne olduğunu gerçekten anlamıyorum. Xcode projesi Derleme Ayarları'ndaki ayarlar ve

arasındaki fark nedir ? 64-bit'i hariç tutmaya ayarlarsam , uygulamamı 64-bit iPhone veya iOS Simulator'da çalıştırdığımda ne olur (Çalıştığını biliyorum, sadece altında ne olduğunu merak ediyorum)? Yeni 64 bit mimariyle büyük karmaşayı açıklayabilir misiniz?ArchitecturesValid architectures
Architectures

görüntü açıklamasını buraya girin


Apple Geliştirici Forumlarına baktınız mı? Bununla ilgili çok sayıda gönderi var. devforums.apple.com/message/887506#887506
trojanfoe

Yanıtlar:


123

Yapı ayarındaki mimariyi Standart mimarilere ayarlayın (armv7, armv7s)

görüntü açıklamasını buraya girin

iPhone 5S, A7 64bit işlemci tarafından desteklenmektedir. Gönderen elma docs

Xcode, uygulamanızı hem 32 bit hem de 64 bit ikili dosyalar dahil ederek oluşturabilir. Bu birleşik ikili program, iOS 7 veya üstü için minimum dağıtım hedefi gerektirir.

Not: Xcode'un gelecekteki bir sürümü, iOS 6 ve sonraki sürümlerde 32 bit çalışma zamanını destekleyen ve iOS 7'de 64 bit çalışma zamanını destekleyen tek bir uygulama oluşturmanıza olanak tanır.

Belgelerden anladığım şey

  • Xcode, tek bir uygulama için hem 64bit 32bit ikili dosyalar oluşturabilir, ancak dağıtım hedefi iOS7 olmalıdır. Gelecekte iOS 6.0 olacağını söylüyorlar
  • 32 bit ikili, iPhone 5S'de (64 bit işlemci) sorunsuz çalışır.

Güncelleme (Xcode 5.0.1)
Xcode 5.0.1'de, iOS 5.1.1 ve sonrası için 64 bit ikili dosya oluşturma desteğini eklediler.

Xcode 5.0.1, uygulamanızı hem 32 bit hem de 64 bit ikili dosyalar ile oluşturabilir. Bu birleşik ikili program, iOS 5.1.1 veya sonraki bir minimum dağıtım hedefi gerektirir. 64 bit ikili dosya yalnızca iOS 7.0.3 ve sonraki sürümleri çalıştıran 64 bit cihazlarda çalışır.

Güncelleme (Xcode 5.1)
Xcode 5.1, mimari bölümünde önemli değişiklikler yaptı. Bu cevap sizin için bir takip olacaktır. Şuna göz at


Sorumda yazdığım gibi, zaten yaptım. Sorum daha çok neyin değiştiği ve altında ne olduğu ile ilgili.
Crazy Yoghurt

düzenleme hakkında: Yani sadece ikili dosyalar dahil mi? Mimari 64-bit'i hariç tutacak şekilde ayarlandığında, iPhone 5S 32-bit ikiliyi çalıştıracak mı?
Crazy Yoghurt

düzenleme hakkında: Minimum dağıtım hedefinin iOS 7.0 değil, iOS 6.0 olması gerektiğini düşünüyorum. @CrazyYoghurt Evet, Mac'te olduğu gibi - 64 bit makineler 32 bit ikili dosyalar çalıştırabilir, aksi takdirde 64 bitlik bir makinenin ilk tanıtıldığında çalıştıracak hiçbir şeyi olmazdı.
trojanfoe

şu anda uygulamayı 5'lerde ve iOS7 dağıtım hedefine sahip diğer cihazlarda çalıştırmak için iOS 7.0
Anil Varghese

3
@CrazyYoghurt O halde bırakmalısın arm64.
trojanfoe

9

Apple Docs'tan anladığım kadarıyla.

  • Xcode yapı ayarlarında Mimariler (ARCHS) nedir ?
    • İkilinin HEDEFLİ olduğu mimariyi / mimarileri belirtir . Birden fazla mimari belirtildiğinde, üretilen ikili, belirtilen mimarinin her biri için nesne kodunu içerebilir.
  • Ne Geçerli Mimarileri Xcode birikmesi ayarları içine (VALID_ARCHS)?

    • Belirtir mimarisi / ikili alabilecek s YAPIM .
    • Oluşturma işlemi sırasında, bu liste ARCHS ile kesişir ve ortaya çıkan liste, ikilinin üzerinde çalışabileceği mimarileri belirtir.
  • Örnek: - Bir iOS projesi, Xcode'da aşağıdaki derleme ayarlarına sahiptir.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • Bu durumda armv7 armv7s arm64 mimarileri için binary oluşturulacaktır. Ama aynı ikili SADECE ARCHS = armv7 armv7s üzerinde çalışacaktır.

9
Hayır, hala kafamı karıştırıyor: S
Ade

"ortaya çıkan liste" nedir?
DanMoore


2
Üzerinde çalışmak istemediğim bir mimari için neden inşa ettiğime dair bir neden bulabilirsem mantıklı olurdu.
rob5408

6

64-bit'i ayarladığınızda, ortaya çıkan ikili, ince bir yağ başlığı ile paketlenmiş üç Mach-O görüntüsünün tümünü içeren bir "Fat" ikilisidir. Bunu otool veya jtool kullanarak görebilirsiniz. İOS 7.0 SDK'nın bir parçası olarak dahil edilen bazı fat binary'leri kontrol edebilirsiniz, örneğin AVFoundation Framework, örneğin:

% 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)

İkilinin kendisine gelince, (çoğunlukla 32-bit ile uyumlu ama) tamamen farklı bir komut seti olan ARM64 bit komut setini kullanır. Bu, özellikle grafik programları için önemlidir (NEON komutlarını ve kayıtlarını kullanarak). Benzer şekilde, CPU'nun daha fazla yazmaçları vardır, bu da program hızı üzerinde oldukça etkili olur. Http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons'ta bunun bir fark yaratıp yaratmayacağı konusunda ilginç bir tartışma var ; kıyaslama testleri şimdiye kadar açıkça gösterdiğini ortaya koydu.

Otool -tV kullanmak, montajı döker (XCode 5 ve sonrasına sahipseniz) ve sonra komut seti farklılıklarını kendiniz görebilirsiniz. Geliştiricilerin çoğu (ama hepsi değil), çoğunlukla Obj-C'yi (CG * API'lerine rağmen) doğrudan etkilemedikleri ve düşük seviyeli işaretçi kullanımı ile daha fazlasını yapmak zorunda oldukları için değişikliklerden habersiz kalacaklar. Derleyici sihrini ve optimizasyonlarını gerçekleştirecek.


6

Yalnızca sizin derleyici sınırlamak gerekmez ARMv7 ve armv7s kaldırarak arm64 desteklenen mimarileri ayarı. Yalnızca Dağıtım hedefi ayarını 5.1.1 olarak ayarlamanız gerekir

Önemli not: Yalnızca sabit değerlere sahip açılır menü olduğundan, Derleme Ayarları bölümünde Dağıtım hedefini 5.1.1 olarak ayarlayamazsınız . Ancak , metin alanına değeri yazarak uygulama ayarlarının Genel bölümünde 5.1.1'e kolayca ayarlayabilirsiniz .


5

Basit düzeltme:

Hedefler -> Yapı Ayarları -> Yapı Seçenekleri -> Bit Kodunu Etkinleştir -> Hayır

İOS 9.3.3 yüklü cihazda çalışır


4

Cevapların hiçbiri işe yaramadı ve sonra Proje -> Genel -> Dağıtım Bilgisi -> Dağıtım Hedefi -> 8.0'da bulunabilecek minimum dağıtım hedefini ayarlamayı unutuyordum.

Misal

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.