Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

今更ながらXcode 7のBitcodeについてまとめてみた

タイトルにあるように今更ながら、Xcode 7でいろいろあったBitcodeについてまとめてみました。

まずはじめに、BitcodeとはXcodeのビルドフローにおける中間言語(LLVM IR)のバイナリ表現です。 LLVM IRにはテキスト表現とバイナリ表現の2種類がありますが、そのうちのバイナリ表現になります。

また、Xcodeの基本的なビルドフローは以下のようになります。

  1. フロントエンドのClangがソースコード中間言語(LLVM IR)に変換する
  2. バックエンドのLLVMLLVM IRをマシン語に変換する

で、Xcode 7以降はデフォルトでBitcodeを含んだデータを生成するようになった感じです(もちろんBuild Settingsで無効にできます。詳しくはこの記事を)

Bitcodeを有効にすることでApple側でアーキテクチャに合ったコンパイルをしてくれるなど、メリットがあるのでなるべく有効にしておくといいと思います。


ちなみに、フレームワーク製作者の方はBitcodeに対応する場合、Build Settingsで有効にするだけだと駄目かもしれないです。詳しくは参考URLにあるのですが、xcodebuildOTHER_CFLAGS="-fembed-bitcode"を設定すると多分いけると思います。

また、実際にアプリケーションに導入してテストする際に、通常のビルドではなくアーカイブまでしてください。じゃないとBitcodeのチェックが入らないので気付かないかもしれませんよ(経験済み)

Bitcodeに対応できていない場合、以下のようなエラーが出ます。

ld: bitcode bundle could not be generated because ~ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture ~
clang: error: linker command failed with exit code 1 (use -v to see invocation)

参考URL

stackoverflow.com