Xcode 7は Bitcode を導入します。これは、何らかの種類のLLVM中間バイナリであり、Appleのサーバーは、関与することなく異なるアーキテクチャ向けにアプリを再コンパイルできます。
Lookbackでは、静的アーカイブフレームワークをライブラリとともに配布しています。 「ビルドとアーカイブ」以外でビルドすると、ビットコードは実際にライブラリに出力されず、アプリでライブラリとリンクし、ビットコードを有効にしてビルドとアーカイブを実行しようとすると、 2つの警告:
ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.
(libがXcode 6でビルドされている場合)ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE)
(通常のxcodebuildを使用してXcode 7でlibをビルドする場合)デバイスとシミュレータのユニバーサルバイナリをビルドするビルドスクリプトがあるため、ビルドとアーカイブを使用できませんが、スクリプトのコマンドラインからxcodebuild
を実行します。 xcodebuild
で適切なビットコード対応ライブラリを生成するにはどうすればよいですか?
ビットコードはコンパイル時の機能(リンク時の機能ではありません)です。つまり、ビットコードを使用してビルドする場合、すべての.oファイルに__bitcodeという追加セクションを含める必要があります。 otool -l (my .o or .a file) | grep __LLVM
を実行すると、バイナリがビットコード互換であるかどうかを確認できます。
正常にビルドすると、Xcodeはビルドフラグ-fembed-bitcode-marker
をclangの呼び出しに追加します。これはある種の「これはビットコードが有効になっている場合、ビットコードが行く場所」のように思われ、実際にはビットコードを有効にしません。
「ビルド&アーカイブ」すると、このフラグは-fembed-bitcode
に置き換えられます。これは、実際にビットコード対応のバイナリをビルドします。
xcodebuild
を使用する-fembed-bitcode
を作成するには2つの方法があるようです。
xcodebuild -target LookbackSDK archive
の代わりにxcodebuild -target LookbackSDK build
のように、「アーカイブ」アクションを使用します。これには、build/
フォルダーの代わりにバイナリをXcodeオーガナイザーに配置するという副作用がありますが、-exportArchive -archivePath ./build
を使用して回避できます(ありがとう @ JensAyton )OTHER_CFLAGS="-fembed-bitcode"
でその他のCフラグを追加して、フラグを強制的に使用します。 xcodebuild
の呼び出しはxcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
のようになります。後者は、ビルドシステムを変更する必要がないように選択したものですが、-fembed-bitcode-marker
と-fembed-bitcode
の両方がclangに送信されるため、すべてのファイルに対して警告が生成されます。後者のLuckillyが勝ち、ビットコード対応ライブラリを生成します!
Xcode 8では、OTHER_CFLAGS="-fembed-bitcode"
が機能しませんでした。静的フレームワークを含むアプリのアーカイブビルドを作成しようとしたときに、was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
の行に沿って何かに走り続けました。
私が本当に探していたのはこれでした:
BITCODE_GENERATION_MODE=bitcode
私は実際に集計ターゲット内でスクリプトの実行を使用しています。xcodebuildの完全な行は次のようになります(参照用)。
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
静的ライブラリのビットコードサポートを追加すると、Xcode 6との互換性がなくなります。アプリはアーカイブされません。
@nevynの答えが少し混乱したので、ビットコードの設定について明確に言及したいと思います。
ビルド設定に移動し、「カスタムコンパイラフラグ」を検索します。 -fembed-bitcode
を追加します。これにより、ビットコードを使用してライブラリが構築されます。
プロジェクトの選択ビルド設定->その他のCフラグで、デバッグを-fembed-bitcode-markerに、リリースを-fembed-bitcodeに設定
ビルド設定で、上部の+記号をクリックして、BITCODE_GENERATION_MODEという名前のユーザー定義ビルド設定を追加し、デバッグをマーカーに、リリースをビットコードに設定します
リリースとしてスキーマを編集し、library.aファイルをなめ、ビルドパスを取得し、リリースフォルダーからライブラリを取得します。