iOS 5でarmv6およびarmv7アーキテクチャ用にビルドする方法


96

ではiOS5をアップル低下いるARMv6からアーキテクチャをARCHS_STANDARD_32_BIT

iPhone3Gのサポートを維持するために、iOS5でもarmv6でコンパイルする必要があります。

誰かがこれに対する解決策を見つけましたか?

回答:


96

今日、iOS 4.0の展開ターゲットを指定して何かをビルドしました。アーキテクチャで指定されているのはarmv7だけでしたが、Xcodeは、iOS4.2より下のものをサポートするにはarmv6をアーキテクチャに含める必要があると警告しました。そのフィールドを編集し、ダイアログがポップアップしたら「+」ボタンをクリックして、リテラル「armv6」を入力します。

私の場合、アプリをiOS4とiOS5で動作させる必要があります。iOS5で正しく機能するようにいくつかの変更を加える必要がありましたが、これらの変更はすべてiOS4に適したコードの変更で行われました。

また、iOS4でクラッシュせずにアプリを実行できるように、iOS5固有の機能をいくつか追加しました。具体的には、iOS5機能を使用する前にテストし、iOS5専用ライブラリをオプションとしてリンクしました。

つまり、iOS5の世界でiPhone3Gをサポートすることは、「iOS5を実行している古いデバイスでアプリを実行することを確認したい」ではなく、「iOS4以降で実行するアプリを(iOS5の機能の使用に関係なく)簡単に」という意味です。 」ここには違いがあります。それについて考えてください。:-)

とにかく、armv6サポートの追加は非常に簡単です。そしてポイントはこれだと思います:ある時点で、(何らかの理由で)心配する必要のあるarmv6デバイスがなくなると、ビルドする必要がなくなります。Appleの見解では、誰もができるだけ早く最新のハードウェアにアップグレードするべきです。したがって、その世界では、デフォルトで最新かつ最高のもの以外にツールを設定する必要はありません。:-)幸運なことに(またはそうではない)、私たちの開発者は現実の世界に住んでいて、しばらくの間古いものをサポートする必要があることを認識しています。Xcode開発チームもこれを知っていると思います。そのため、armv6サポートを簡単に追加できます。


3
正確な回答をありがとうございます:-)確かに私は、iOS 4.2.1以下(4.0に限定)のiPhone 3Gでアプリを実行し、現在のデバイスにiOS 5固有の機能をいくつか提供したいと考えています。アーキテクチャに「armv6」を追加するだけではなく、ARCHS_STANDARD_32_BITのような環境変数を探していましたが、ARCHS_UNIVERSAL_IPHONE_OSを見つけましたが、動作しないようです。
iGranDav 2011

3
そこにある多くの解決策が「armv6 armv7」と言うべきであることを示唆していることを付け加えたい-これは私にとってはうまくいかなかった。現在、「armv6 $(ARCHS_STANDARD_32_BIT)」のみが機能します。つまり、そこにあるものを削除せずに、「armv6」をアーキテクチャ設定に追加するだけです
Brack

1
私はすべてこれを実行しましたが、ビルドはまだ失敗していました-デバッグと配布が3.0に設定されているときに、(未使用の)リリースビルドがiOS 5.0のデプロイメントターゲットに設定されていたため、armv6のxcodeビルドが停止したようです。すべてのビルドで展開ターゲットを3.0に設定すると、問題が修正されました。
Simon East

6
( 'armv6'を追加した後でも)それは私にはうまくいきませんでした。アプリは私のiPod touchにも表示されませんでした。しかし、その後、「必要なデバイス機能」(情報タブの下)にarmv7が含まれていることを発見しました。私はそれを削除しただけで、完全に動作し始めました
Erpheus

1
通常は$(VALID_ARCHS)を使用しますが、これでうまくいきます。新しいプロジェクトでも機能要件「arm7」が追加されることがわかりました。私はそれを削除しただけで、すべて正常に動作します。
Gordon Dove

51

簡単な答えは、現在の設定を「標準(armv7)-$(ARCHS_STANDARD_32_BIT)」から「armv6」と「armv7」に変更する必要があるということです。下の画像を参照してください。機能させるには、前の設定の行を削除する必要があります。

armv6およびarmv7の正しい設定


3
これについて画像で説明していただきありがとうございます。本当にわかりやすくなりました。
radven

11

また、プロジェクトとターゲットでこれを設定していることを確認してください。それを理解するには1時間かかります。片方には設定しましたが、もう片方には設定しませんでした。お役に立てれば。GLTA


また、ライブラリがある場合は、それをプロジェクトとターゲットに設定する必要があります。
William Jockusch

9

Appleがarmv6を標準設定から外したのには理由があると思います。

iOS5 SDKでarmv7 / armv6をコンパイルしましたが、armv6コンパイラはリリースモードで誤ったコードを生成しました。何時間もの回避策(llvmまたはgccをさまざまな最適化レベルで試す)を見つけた後、あきらめました。

したがって、古いarmv6デバイスをサポートしている限り、iOS SDK 4.xに戻ります。

コードの例:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

たぶん、メモリが破損している可能性がありますが、armv7コンパイラとiOSSDK 5.0未満では期待どおりに動作します。

宜しくお願いします


また、古いデバイスのarmv6ビルドに奇妙なバグが見られます。これを理解しましたか、それとも以前のXCodeに戻りましたか?また、古いSDKをダウンロードできないようになっていることにも注意してください。
クレイグ・マクマホン

19
これは、Xcode 4.2のLLVMコンパイラ3.0およびCGPoint / CGSize構造体の既知の問題です:devforums.apple.com/thread/122059?tstart=15。armv6でThumbのビルドを無効にすると、この種のエラーが防止されます。
Brad Larson

うわー!私はあなたの答えをとても嬉しく思います、これは私にも起こっています。
Clafou

7

これが実際に解決策であるかどうかはまだわかりませんが、「architectures」で定義されている文字列($(ARCHS_STANDARD_32_BIT))を「armv6 armv7」で置き換えると、iOS5をベースとして、iOS4をデプロイメントとしてコンパイルできることがわかりましたターゲット、および検証を渡します。

IOS5専用のライブラリや呼び出しを使用していませんが、次のリリースで使用する予定です。


1

アプリをコンパイルしてApp Storeにアップロードするために、$(ARCHS_STANDARD_32_BIT)をarmv7に置き換える必要はありませんでした。

MarkGranoffが提案したように、私はarmv6をプレーンテキストとして追加しました。プラスを押して2行目に入力するだけです。

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