Xcode5およびiOS7:アーキテクチャと有効なアーキテクチャ


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ビットのiPhoneまたはiOSシミュレーターでアプリを実行するとどうなりますか(動作することはわかっていますが、その下で何が起こるのか興味があります)?新しい64ビットアーキテクチャの大きな混乱について説明できますか?ArchitecturesValid architectures
Architectures

ここに画像の説明を入力してください


Apple Developer Forumsを見たことがありますか?これについてはたくさんの投稿があります。devforums.apple.com/message/887506#887506
trojanfoe

回答:


123

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

ここに画像の説明を入力してください

iPhone 5Sは、A764ビットプロセッサを搭載しています。アップルのドキュメントから

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

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

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

  • Xcodeは、単一のアプリに対して両方の64ビット32ビットバイナリを作成できますが、展開ターゲットはiOS7である必要があります。彼らは将来それがiOS6.0になるだろうと言っています
  • 32ビットバイナリはiPhone5S(64ビットプロセッサ)で正常に動作します。

アップデート(Xcode 5.0.1)
Xcode 5.0.1では、iOS5.1.1以降の64ビットバイナリを作成するためのサポートが追加されました。

Xcode 5.0.1は、32ビットと64ビットの両方のバイナリを含むアプリを構築できます。この結合されたバイナリには、iOS5.1.1以降の最小デプロイメントターゲットが必要です。64ビットバイナリは、iOS7.0.3以降を実行している64ビットデバイスでのみ実行されます。

アップデート(Xcode 5.1)
Xcode 5.1は、アーキテクチャセクションに大幅な変更を加えました。この回答はあなたのフォローアップになります。 これをチェックして


私の質問に書いたように、私はすでにそれをしました。私の質問は、それが何を変え、その下で何が起こるかについてです。
クレイジーヨーグルト

編集について:それで、それは含まれているバイナリについてだけですか?アーキテクチャが64ビットを除外するように設定されている場合、iPhone 5Sは32ビットバイナリを実行しますか?
クレイジーヨーグルト

編集について:最小のデプロイメントターゲットはiOS7.0ではなくiOS6.0でなければならないと思います。@CrazyYoghurtはい、Macと同様に、64ビットマシンは32ビットバイナリを実行できます。そうでない場合、64ビットマシンは最初に導入されたときに何も実行できません。
trojanfoe 2013

現在、iOS7の展開ターゲットを持つ5sおよびその他のデバイスでアプリを動作させるには、iOS 7.0
Anil Varghese

3
@CrazyYoghurt次に、ドロップする必要がありますarm64
trojanfoe 2013

9

AppleDocsからの私の理解。

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

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

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

9
いいえ、まだ私を混乱させています:S
Ade 2014年

「結果リスト」とは何ですか?
DanMoore 2014年


2
実行したくないアーキテクチャー用に構築する理由を見つけることができれば、それは理にかなっています。
rob5408 2016年

6

64ビットを設定すると、結果のバイナリは「ファット」バイナリになります。これには、薄いファットヘッダーがバンドルされた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にもかかわらず)に直接影響を与えず、低レベルのポインター処理でより多くのことを行う必要があります。コンパイラはその魔法と最適化を行います。


6

サポートされているアーキテクチャからarm64設定を削除することにより、コンパイラをarmv7armv7sのみに制限する必要はありません。デプロイメントターゲット設定を5.1.1に設定する必要があります

重要な注意:固定値のみのドロップダウンであるため、[ビルド設定]セクションで展開ターゲットを5.1.1に設定することはできません。ただし、テキストフィールドに値を入力するだけで、アプリケーション設定の[一般]セクションで5.1.1に簡単に設定できます。


5

簡単な修正:

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

iOS9.3.3を搭載したデバイスで動作します


4

いずれの回答も機能せず、プロジェクト->一般->展開情報->展開ターゲット-> 8.0にある最小展開ターゲットを設定するのを忘れていました。

例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.