Xcode 5 und iOS 7: Architektur und gültige Architekturen

81

Ich starte ein neues Projekt in Xcode 5. Ich möchte eine Anwendung mit, iOS SDK 7aber mit Bereitstellungsziel entwickeln iOS 5.0. Sobald ich ein neues Projekt in Xcode erstelle und versuche, das Bereitstellungsziel auf 5.0 zu ändern, wird folgende Meldung angezeigt:

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.

Also geänderte Architekturen auf Standard(kein 64bit). Ich kompiliere, laufe, aber ich verstehe nicht wirklich, was gerade passiert ist.

Was ist der Unterschied zwischen Architecturesund Valid architecturesEinstellungen in den Build-Einstellungen des Xcode-Projekts?
Wenn ich Architectures64-Bit ausschließen möchte, was passiert, wenn ich meine App auf einem 64-Bit-iPhone oder iOS-Simulator ausführe (ich weiß, dass es funktioniert, ich bin nur neugierig, was darunter passiert)?
Können Sie das große Durcheinander mit der neuen 64-Bit-Architektur erklären?

Geben Sie hier die Bildbeschreibung ein

Verrückter Joghurt
quelle
Haben Sie sich die Apple Developer Forums angesehen? Es gibt viele Beiträge dazu. devforums.apple.com/message/887506#887506
trojanfoe

Antworten:

122

Stellen Sie die Architektur in der Build-Einstellung auf Standardarchitekturen (armv7, armv7s) ein.

Geben Sie hier die Bildbeschreibung ein

Das iPhone 5S wird von einem A7 64-Bit-Prozessor angetrieben. Aus Apple Docs

Xcode kann Ihre App sowohl mit 32-Bit- als auch mit 64-Bit-Binärdateien erstellen. Diese kombinierte Binärdatei erfordert ein Mindestbereitstellungsziel von iOS 7 oder höher.

Hinweis: Mit einer zukünftigen Version von Xcode können Sie eine einzelne App erstellen, die die 32-Bit-Laufzeit unter iOS 6 und höher und die 64-Bit-Laufzeit unter iOS 7 unterstützt.

Aus der Dokumentation habe ich verstanden

  • Xcode kann beide 64-Bit-32-Bit-Binärdateien für eine einzelne App erstellen, das Bereitstellungsziel sollte jedoch iOS7 sein. Sie sagen, dass es in Zukunft iOS 6.0 sein wird
  • 32-Bit-Binärdateien funktionieren in iPhone 5S (64-Bit-Prozessor) einwandfrei.

Update (Xcode 5.0.1)
In Xcode 5.0.1 wurde die Unterstützung zum Erstellen von 64-Bit-Binärdateien für iOS 5.1.1 hinzugefügt.

Xcode 5.0.1 kann Ihre App mit 32-Bit- und 64-Bit-Binärdateien erstellen. Diese kombinierte Binärdatei erfordert ein Mindestbereitstellungsziel von iOS 5.1.1 oder höher. Die 64-Bit-Binärdatei wird nur auf 64-Bit-Geräten mit iOS 7.0.3 und höher ausgeführt.

Update (Xcode 5.1)
Xcode 5.1 hat im Architekturbereich wesentliche Änderungen vorgenommen. Diese Antwort wird eine Folge für Sie sein. Überprüfen Sie dies

Anil Varghese
quelle
Wie ich in meiner Frage geschrieben habe, habe ich es bereits getan. Meine Frage ist mehr darüber, was sich ändert und was darunter passiert.
Verrückter Joghurt
about edit: Es geht also nur um enthaltene Binärdateien? Wenn die Architektur 64-Bit ausschließt, wird auf dem iPhone 5S eine 32-Bit-Binärdatei ausgeführt.
Verrückter Joghurt
Informationen zum Bearbeiten: Ich denke, das Mindestziel für die Bereitstellung muss iOS 6.0 sein, nicht iOS 7.0. @CrazyYoghurt Ja, wie bei Mac - 64-Bit-Computer können 32-Bit-Binärdateien ausführen, andernfalls hätte ein 64-Bit-Computer bei der ersten Einführung nichts zu tun.
Trojaner
Derzeit sollte die App auf 5s und anderen Geräten mit iOS7-Bereitstellungsziel iOS 7.0
Anil Varghese
3
@ CrazyYoghurt Dann musst du fallen lassen arm64.
Trojaner
8

Mein Verständnis von Apple Docs.

  • Was sind Architekturen (ARCHS) in Xcode-Build-Einstellungen?
    • Gibt die Architektur (en) an, für die die Binärdatei ZIELGESTELLT ist . Wenn mehr als eine Architektur angegeben wird, kann die generierte Binärdatei Objektcode für jede der angegebenen Architekturen enthalten.
  • Was ist gültige Architekturen (VALID_ARCHS) in Xcode-Build-Einstellungen?

    • Gibt Architekturen an, für die die Binärdatei BUILT sein kann .
    • Während des Erstellungsprozesses wird diese Liste mit ARCHS geschnitten und die resultierende Liste gibt die Architekturen an, auf denen die Binärdatei ausgeführt werden kann.
  • Beispiel: - Ein iOS-Projekt verfügt über die folgenden Build-Einstellungen für Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • In diesem Fall wird eine Binärdatei für armv7 armv7s arm64-Architekturen erstellt. Dieselbe Binärdatei wird jedoch NUR auf ARCHS = armv7 armv7s ausgeführt.
sw_engineer
quelle
9
Nein, verwirrt mich immer noch zum Teufel: S
Ade
Was ist die "resultierende Liste"?
DanMoore
@DanMoore Das Ergebnis der festgelegten Schnittmenge .
Slipp D. Thompson
2
Es wäre sinnvoll, wenn ich einen Grund finden könnte, warum ich für eine Architektur bauen würde, auf der ich nicht laufen möchte.
rob5408
6

Wenn Sie 64-Bit einstellen, ist die resultierende Binärdatei eine "Fat" -Binärdatei, die alle drei Mach-O-Bilder enthält, die mit einem dünnen Fat-Header gebündelt sind. Sie können dies mit otool oder jtool sehen. Sie können einige fette Binärdateien überprüfen, die im iOS 7.0 SDK enthalten sind, z. B. das AVFoundation Framework:

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

Die Binärdatei selbst verwendet den ARM64-Bit-Befehlssatz, der (meistens kompatibel mit 32-Bit, aber) ein völlig anderer Befehlssatz ist. Dies ist besonders wichtig für Grafikprogramme (unter Verwendung von NEON-Anweisungen und -Registern). Ebenso verfügt die CPU über mehr Register, was sich erheblich auf die Programmgeschwindigkeit auswirkt. Unter http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons gibt es eine interessante Diskussion darüber, ob dies einen Unterschied macht oder nicht. Benchmarking-Tests haben bisher eindeutig gezeigt, dass dies der Fall ist.

Wenn Sie otool -tV verwenden, wird die Assembly ausgegeben (wenn Sie XCode 5 und höher haben), und dann können Sie die Unterschiede im Befehlssatz selbst sehen. Die meisten (aber nicht alle) Entwickler bleiben gegenüber den Änderungen agnostisch, da sie Obj-C zum größten Teil nicht direkt beeinflussen (trotz CG * -APIs) und mehr mit der Zeigerbehandlung auf niedriger Ebene zu tun haben. Der Compiler wird seine Magie und Optimierungen arbeiten.

Technologeeks
quelle
6

Sie müssen Ihren Compiler nicht nur auf armv7 und armv7s beschränken, indem Sie die Einstellung arm64 aus den unterstützten Architekturen entfernen . Sie müssen lediglich die Einstellung für das Bereitstellungsziel auf 5.1.1 festlegen

Wichtiger Hinweis: Sie können das Bereitstellungsziel im Abschnitt " Build-Einstellungen" nicht auf 5.1.1 festlegen, da es nur mit festen Werten als Dropdown- Liste angezeigt wird. Sie können es jedoch einfach auf 5.1.1 im Abschnitt Allgemein der Anwendungseinstellungen einstellen, indem Sie einfach den Wert in das Textfeld eingeben.

Kibernetik
quelle
5

Einfache Lösung:

Ziele -> Build-Einstellungen -> Build-Optionen -> Bitcode aktivieren -> Nein

Funktioniert auf Geräten mit iOS 9.3.3

Maselko
quelle
4

Keine der Antworten funktionierte und dann vergaß ich, ein Mindestbereitstellungsziel festzulegen, das unter Projekt -> Allgemein -> Bereitstellungsinformationen -> Bereitstellungsziel -> 8.0 zu finden ist

Beispiel

tsuz
quelle