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


88

Xcode7はビットコードを導入しますは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) (libが通常のxcodebuildを使用してXcode 7でビルドされている場合)

デバイスとシミュレータのユニバーサルバイナリをビルドするビルドスクリプトがあるため、Build&Archiveを使用できませんがxcodebuild、スクリプトのコマンドラインから実行します。xcodebuild適切なビットコード対応ライブラリを生成するにはどうすればよいですか?


こんにちは@nevynビットコードを使用するアプリでSDKをコンパイルしようとしています。方法はありますか?
Stoff81 2017年

@ Stoff81申し訳ありませんが、作業中です。最初にすべての依存関係をビットコードで機能させる必要があり、それはかなりの作業です。
nevyn 2017年

回答:


137

ビットコードはコンパイル時の機能(リンク時の機能ではありません)です。つまり、ビットコードを使用してビルドする場合、すべての.oファイルに__bitcodeという追加のセクションを含める必要があります。を実行すると、バイナリがビットコード互換かどうかを確認できますotool -l (my .o or .a file) | grep __LLVM

通常のビルドでは、Xcodeはビルドフラグを追加します -fembed-bitcode-markerclangの呼び出しにをます。これはある種の「ビットコードが有効になっている場合にビットコードが移動する場所」のようであり、実際にはビットコードを有効にしません。

「ビルド&アーカイブ」すると、このフラグはに置き換えられます-fembed-bitcode。これは、実際にはビットコード対応のバイナリをビルドします。

xcodebuild利用するには2つの方法があるようです-fembed-bitcode

  • xcodebuild -target LookbackSDK archive代わりに、のように「アーカイブ」アクションを使用しますxcodebuild -target LookbackSDK build。これには、build/フォルダーではなくXcodeオーガナイザーにバイナリを配置するという副作用がありますが、-exportArchive -archivePath ./build(thanks @JensAyton)を使用して回避できます。
  • を使用して他のCフラグを追加することにより、フラグの使用を強制しますOTHER_CFLAGS="-fembed-bitcode"。あなたのxcodebuild呼び出しは次のようになりますxcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build

後者は、私は私が私のビルドシステムを変更する必要はありませんが、それは今、両方のために、すべてのファイルに対して警告を生成しますので、ということを選んだものです-fembed-bitcode-marker-fembed-bitcode打ち鳴らすに送信されます。後者が勝ち、ビットコード対応のライブラリが生成されます。

リソース


9
FWIW、-fembed-bitcode-marker追加することで無視されるという警告を取り除くことができます-Qunused-arguments
mstorsjo 2015

フレームワークのxcodebuildにどのexportFormatを使用しますか?「ipa」、「pkg」、「app」のみが定義されているようです(developer.apple.com/library/mac/documentation/Darwin/Reference/…)。
ファビアンKöbel

@nevynそれでも、カスタムフレームワークファイルを含むメインアプリをビルドできませんでした。このファイルには、上記のフラグが付いたビルドスクリプトが含まれています。
ravoorinandan 2016年

otool -l(私の.oまたは.aファイル)。otool -l(私の.oまたは.aファイル)を意味しますか?grep __bitcode?
マイクM

1
@MikeMは実際にotool -l myfile.o | grep __LLVMはありません。実際のビットコードではなく、ビットコードマーカーしかない場合でも、__ビットコードセグメントが存在するためです。
nevyn 2016

40

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


2
+1、この回答でBITCODE_GENERATION_MODE=bitcode示唆されているように、この方法が好ましいようです。
ウィリアムデニス2017年

これは私の問題も修正しましたが、デフォルトの答えはもう修正されていません。
カムチャッカ

命の恩人!ありがとうございました!
vidalbenjoe

17

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

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

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


6

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

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

スキーマをリリースとして編集次に、目的のライブラリをクリックします。ファイルとビルドパスを取得します。ライブラリフォームのリリースフォルダを取得します。

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