18

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

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

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

4

4 に答える 4

12

ここに私が見つけた良い解決策があります: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 は有効なアーキテクチャではありません」というエラーが表示されます。これを回避するには、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 をサポートする静的ライブラリ

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

于 2013-12-11T10:36:50.513 に答える
8

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

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

于 2010-06-11T06:57:02.600 に答える
3

もう再参加する前に、ファット ライブラリから抽出する必要はないようです (ジェイミーの回答で説明されているように)。Apple の最終版 4.0 SDK を使用しています。これは、デフォルトでファット 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 では失敗しますが、(現在太っている) アーム ライブラリからアーキテクチャを削除すると問題なく動作します。

$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 は、ファット ライブラリ内のアーキテクチャを検出できる必要があります。

于 2010-06-24T13:38:52.663 に答える
2

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 
于 2010-05-08T08:35:36.393 に答える