web-dev-qa-db-ja.com

ビットコードを有効にして静的ライブラリをxcodebuildするにはどうすればよいですか?

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で適切なビットコード対応ライブラリを生成するにはどうすればよいですか?

80
nevyn

ビットコードはコンパイル時の機能(リンク時の機能ではありません)です。つまり、ビットコードを使用してビルドする場合、すべての.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が勝ち、ビットコード対応ライブラリを生成します!

資源

126
nevyn

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

34
Aaron Ash

静的ライブラリのビットコードサポートを追加すると、Xcode 6との互換性がなくなります。アプリはアーカイブされません。

@nevynの答えが少し混乱したので、ビットコードの設定について明確に言及したいと思います。

ビルド設定に移動し、「カスタムコンパイラフラグ」を検索します。 -fembed-bitcodeを追加します。これにより、ビットコードを使用してライブラリが構築されます。

17
Gautam Jain

プロジェクトの選択ビルド設定->その他のCフラグで、デバッグを-fembed-bitcode-markerに、リリースを-fembed-bitcodeに設定

ビルド設定で、上部の+記号をクリックして、BITCODE_GENERATION_MODEという名前のユーザー定義ビルド設定を追加し、デバッグをマーカーに、リリースをビットコードに設定します

リリースとしてスキーマを編集し、library.aファイルをなめ、ビルドパスを取得し、リリースフォルダーからライブラリを取得します。