web-dev-qa-db-ja.com

Xcode 5およびiOS 7:アーキテクチャと有効なアーキテクチャ

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.

そのため、アーキテクチャをStandardname__(64ビットなし)に変更しました。コンパイルして実行しますが、何が起こったのか本当にわかりません。

Xcodeプロジェクトのビルド設定のArchitecturesname__設定とValid architectures設定の違いは何ですか?
Architecturesname__を設定して64ビットを除外すると、64ビットのiPhoneまたはiOSシミュレーターでアプリを実行したときに何が起こるかがわかります(動作することはわかっていますが、下に何があるのか​​興味があります)。
新しい64ビットアーキテクチャの大きな混乱を説明できますか?

enter image description here

81
Crazy Yoghurt

ビルド設定でアーキテクチャをに設定します標準アーキテクチャ(armv7、armv7s)

enter image description here

iPhone 5Sは、A7 64ビットプロセッサを搭載しています。 Apple docs から

Xcodeは、32ビットと64ビットの両方のバイナリを含むアプリをビルドできます。この結合されたバイナリには、iOS 7以降の最小展開ターゲットが必要です。

注:Xcodeの将来のバージョンでは、iOS 6以降で32ビットランタイムをサポートし、iOS 7で64ビットランタイムをサポートする単一のアプリを作成できるようになります。

私が理解したドキュメントから

  • Xcodeは1つのアプリに対して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ビットバイナリは、iOS 7.0.3以降を実行している64ビットデバイスでのみ実行されます。

アップデート(Xcode 5.1)
Xcode 5.1は、アーキテクチャセクションに大きな変更を加えました。この answer はフォローアップになります。 チェックしてください

121
Anil Varghese

64ビットを設定すると、結果のバイナリは「Fat」バイナリになります。これには、3つのMach-Oイメージがすべてシンファットヘッダーにバンドルされています。 otoolまたはjtoolを使用してそれを確認できます。次のように、iOS 7.0 SDKの一部として含まれているいくつかのファットバイナリ、たとえば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)

バイナリ自体に関しては、ARM64ビット命令セットを使用します(ほとんどの場合32ビットと互換性がありますが、まったく異なる命令セットです)。これは、グラフィックプログラムでは特に重要です(NEON命令とレジスタを使用)。同様に、CPUにはより多くのレジスタがあり、プログラムの速度に大きな影響を与えます。 http://blogs.barrons.com/techtraderdaily/2013/09/19/Apple-the-64-bit-question/?mod=yahoobarrons で興味深い議論があります違い;ベンチマークテストは、これまでのところ明確に示しています。

Otool -tVを使用すると、アセンブリがダンプされ(XCode 5以降を使用している場合)、命令セットの違いを自分で確認できます。ほとんど(すべてではない)の開発者は、Obj-C(それにもかかわらずCG * API)に直接影響を与えず、低レベルのポインター処理でより多くのことをしなければならないため、変更にとらわれません。コンパイラーは、その魔法と最適化を実行します。

7
Technologeeks

Appleドキュメントからの私の理解。

  • Architectures(ARCHS)とXcodeビルド設定とは何ですか?
    • バイナリがターゲットであるアーキテクチャを指定します。複数のアーキテクチャを指定すると、生成されたバイナリには、指定された各アーキテクチャのオブジェクトコードが含まれる場合があります。
  • 有効なアーキテクチャ(VALID_ARCHS)とXcodeビルド設定とは何ですか?

    • バイナリがBUILTになる可能性のあるアーキテクチャを指定します。
    • ビルドプロセス中、このリストはARCHSと交差し、結果のリストはバイナリが実行できるアーキテクチャを指定します。
  • 例:-1つのiOSプロジェクトには、Xcodeへの次のビルド設定があります。

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • この場合、バイナリはarmv7 armv7s arm64アーキテクチャ用に構築されます。ただし、同じバイナリはARCHS = armv7 armv7sのみで実行されます。
7
engineer

サポートされているアーキテクチャからarm64設定を削除することで、コンパイラをarmv7およびarmv7sのみに制限する必要はありません。 Deployment target設定を5.1.1に設定するだけです

重要な注記:Build SettingsセクションでDeployment targetを5.1.1に設定することはできません。これは固定値のドロップダウンのみであるためです。ただし、テキストフィールドに値を入力するだけで、アプリケーション設定のGeneralセクションで簡単に5.1.1に設定できます。

6
Kibernetik

簡単な修正:

ターゲット->ビルド設定->ビルドオプション->ビットコードを有効にする->いいえ

IOS 9.3.3を搭載したデバイスで動作します

5
Maselko

答えはどれも機能せず、Project->にある最小の展開ターゲットを設定するのを忘れていました一般->展開情報->展開ターゲット-> 8.0

Example

4
tsuz