web-dev-qa-db-ja.com

armv6、armv7、i386の静的ライブラリ(fat)をコンパイルするにはどうすればよいですか?

私はこの質問が何度か提起されたことを知っていますが、私の目標は私がウェブを検索して見つけたものに関して少し異なります。具体的には、iPhone用の静的ライブラリをすでに構築できますが、構築できる最終的なファットファイルにはarmアーキテクチャとi386アーキテクチャしか含まれていません(armが何を指しているのかわかりません:v6またはv7ですか?)。 armv6とarmv7専用にコンパイルすることはできず、lipoを使用して両方のアーキテクチャをマージします。リポツールは、同じアーキテクチャ(armv6またはarmv7ではなくarm)がarmv6ライブラリとarmv7ライブラリの両方に存在することを訴えます。

誰かがarmv6とarmv7のビルド方法を正確に説明でき、lipoを使用してこれらのライブラリをファットファイルにマージできますか?

[〜#〜] edit [〜#〜]:Xcodeを使用せずに、従来のUNIXライブラリを直接コンパイルしてビルドする必要があります。

17
Massimo Cafaro

Libtoolを使用して、2つのarm6バージョンとarm7バージョンをリンクします。これはXCodeの機能です。ただし、これらの静的ライブラリを新しいスーパーライブラリに結合しようとすると、問題が発生します。それを行う必要がある場合は、 this をお読みください。

すでにこれを行っている場合は、lipoが「armv6」ライブラリにarmv6とarmv7の両方が含まれていると文句を言っているのはそのためです。私の投稿には、XCodeを使用しないため、おそらく簡単になる修正が含まれていますが、基本的には、lipo抽出を使用して、先に進む前に、薄いarmv6ライブラリと薄いarmv7ライブラリがあることを確認します。

7
jamie

これが私が見つけた良い解決策です: iOS 5とArm64をサポートする静的ライブラリ

編集:

解決策は、異なるアーキテクチャを分離して構築し、コマンドライン(またはRakefile)を使用してlipoを使用してそれらをバインドすることです。

まず、xcodebuildを使用してarmでバイナリをビルドします。

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm'

IPHONEOS_DEPLOYMENT_TARGET = '5.0'およびARCHS = 'armv7 armv7s'を設定する必要があることに注意してください。より明確にするために、ビルドおよび製品のディレクトリを設定することをお勧めします。このフラグの意味の詳細については、ビルド設定リファレンスを参照してください。

Arm64の次のビルド:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64'

ARCHSとIPHONEOS_DEPLOYMENT_TARGETの違いに注意してください。また、シミュレーター用にビルドする必要があります。この場合、sdkをiphonesimulator7.0に変更し、最初にi386用に2つのステップでビルドする必要があります。

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386'

今トリッキーな部分! Xcode設定に応じてARCHSをx86_86に変更すると、「x86_64は有効なArchではありません」のようなエラーが発生します。これを回避するには、VALID_ARCHS = 'x86_64'を追加するだけです。

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64'

最後に、5つのアーキテクチャすべてでファットバイナリを作成する必要があります。

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a'

著者はこれの実用的な例を作成しました、あなたはそれを得ることができます: https://github.com/diogot/StaticLibDemo


投稿へのリンクは次のとおりです。 iOS 5およびArm64をサポートする静的ライブラリ

すべてのクレジットはDiogoTridapalliに送られます。

11
Yang

(jamieの回答で説明されているように)再結合する前にfatライブラリから抽出する必要はないようです。私はAppleの最終的な4.0SDKを使用しています。これは、デフォルトでファットarmv6/armv7ライブラリを作成しているように見えます。

以前は、次のように入力ライブラリのアーキテクチャを指定していました。

$DEVROOT/usr/bin/lipo -Arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -Arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a

これは後のSDKでは失敗しますが、(現在は太い)armlibからアーキテクチャを削除しても問題なく機能します。

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -Arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a

Lipoは、fatライブラリのアーキテクチャを検出できる必要があります。

3
gazreese

ビルド設定が_Valid Architectures: armv6 armv7_およびArchitectures: Optimized (armv6 armv7)に設定されていることを確認してください。これにより、v6とv7の両方に最適化されたバイナリが生成されます。うまくいくかどうかわからない場合は、Architectures: Standard (armv6)を設定して、ファイルサイズを比較してください。最適化すると、2倍のサイズが生成されます(私が正しく覚えている場合)。

また、バイナリで_lipo -info_をいつでも使用して、含まれているすべてのアーキテクチャを確認できます。

アプリのディストリビューションビルドで実行すると、次のようになります。

_ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My
Architectures in the fat file: My are: armv6 armv7 
_
2
stigi