web-dev-qa-db-ja.com

`-fembed-bitcode`とBITCODE_GENERATION_MODEの違いは何ですか?

ビットコードをサポートするために静的ライブラリを更新しましたが、私の研究からそれを達成するための2つの方法を見つけました。

  • プロジェクトのビルド設定のその他のCフラグオプションにfembed-bitcodeフラグを追加する( link
  • BITCODE_GENERATION_MODEbitcodeに設定したユーザー定義設定の追加( link

これら2つのオプションに違いはありますか?

唯一の違いは、fembed-bitcodeを使用すると、iphonesimulatorの静的ライブラリが完全なビットコードを有効にして構築されることです(私の場合、バイナリサイズは5MBから13MBに変更され、otool)、使用法に違いはないようです。

27
heitortsergent

ENABLE_BITCODE=YESでライブラリを通常にビルドすると、Xcodeはビルドフラグ-fembed-bitcode-markerをclangの呼び出しに追加し、最終的なoファイルに「空の」ビットコードを配置します。

したがって、ビルドフェーズでコンパイルアクションを見ると、次のようになります。

CompileC {build_path} /StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m normal armv7 Objective-c com.Apple.compilers.llvm.clang.1_0.compiler cd {path}/StaticBitcode export LANG = en_US.US-ASCII export PATH = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin :/ bin:/ usr/sbin:/ sbin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x Objective-c -Arch armv7 -fmessage-length = 0 -fdiagnostics -show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- [...]-fembed-ビットコードマーカー[...]

これは、ビルドアクションに当てはまります(ターゲットに依存しません)。

Build & Archiveを実行すると、-fembedフラグが-fembed-bitcodeに置き換えられます。これは、実際にビットコード対応バイナリを構築します。

CompileC {build_path} /StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m normal armv7 Objective-c com.Apple.compilers.llvm.clang.1_0.compiler cd {path}/StaticBitcode export LANG = en_US.US-ASCII export PATH = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin :/ bin:/ usr/sbin:/ sbin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x Objective-c -Arch armv7 -fmessage-length = 0 -fdiagnostics -show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- [...]-fembed-ビットコード[...]


fembed-bitcodeフラグ

したがって、-fembed-bitcodeフラグをその他のCフラグに追加すると、コンパイル時に2つのフラグがコンパイラーに送信されます。別のプロジェクトにリンクされているライブラリを使用しているときに受け取る警告をいくつか沈黙させます。ただし、期待される動作が得られるかどうかを確認する必要があります。 :)

(他のCフラグで-fembed-bitcodeを使用してテストしたとき、Xcodeはclang: warning: argument unused during compilation: '-fembed-bitcode-marker'という警告を出しました)


BITCODE_GENERATION_MODE

一方、

BITCODE_GENERATION_MODE=bitcodeUser-defined Settingを設定すると、ビルドフェーズ中でも、ファイルは-fembed-bitcodeフラグを使用してコンパイルされます。

また、BITCODE_GENERATION_MODE=markerを設定すると、アクションフェーズに関係なく、フラグは-fembed-bitcode-markerを使用してコンパイルされます。

そのため、すべてのアクション(ビルドとアーカイブ)でビットコードを有効にしたい場合、BITCODE_GENERATION_MODE設定を使用するのがより良い方法です。


資源