Xcode 7ではデフォルトでビルド時にビットコードが含まれる (2015年9月25日追記あり)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

2015年9月9日にアップル社よりXcode 7 GM seed ((GM seedはAppleにおける製品候補版の名称で、アップデートの余地はあるものの、テストで深刻なバグがないことが確認された段階でそれが正式版になる)) が提供され、iOS 9向け及びOS X El Capitan向けのアプリ向けの開発環境の準備が整いつつあるが、Xcode 7では地味に要注意箇所がいくつかある。

iOS9+Xcode7の組み合わせ時に発生する起動時のクラッシュ問題とネットワークリクエスト問題についてはiOS 9/El Capitan/Xcode 7以降で要注意箇所およびApp Transport SecurityのTLS要件が思った以上に厳しかった件を参照してもらいたい。今回は別件たるビットコードについて説明したい。

Xcode 7からはiOS向けバイナリーではデフォルトでビットコードが含まれるようになる

Xcode 6.xまではビルド時はそれぞれのアーキテクチャー ((OS Xであれば近年ではx86またはx86_64あるいはその両方のUniversal Binary、iOS向けには32bitARMアーキテクチャーまたはそれに64bitARMアーキテクチャーが加わったUniversal Binary)) 向けの機械語がビルドされていたが、Xcode 7以降ではiOS向けバイナリー(アプリ/フレームワーク/ライブラリー)ではそれらに加えてデフォルトでLLVMビットコードがバイナリーパッケージに含まれるようになる(OS X向けバイナリーでは従来通りビットコードが含まれないので要注意)

LLVMビットコードとは

LLVMビットコードはJavaでいう中間コードに相当するものであり、それぞれのプラットフォームに依存しない言語で書かれている。今日のMacの開発環境で使われているXcodeでは通常、コンパイラーとしてLLVMとClang ((正式にはそれにアップルのカスタムが加えられたもの)) を使用しており、メカニズムとしてはまずはC/C++/Objective-CのコードをClangで一旦LLVMビットコードに変換した上で、LLVMでネイティブの機械語コードに変換するという手法を採用している。Xcode 7ではClangで変換され、LLVMでネイティブコードに変換される前の中間コードが含まれた形式に変更されるということになる。

ビットコードを含むことによる利点

LLVMビットコードが含まれるようになることによって、最低限App Storeで提供されているアプリについてはアップル側でそれぞれのアーキテクチャーに合ったネイティブのコードがコンパイルされるようになり、パフォーマンスの向上が見込める可能性がある。また、iOS端末やMacのアーキテクチャーが変更されるといった事態になった時 ((過去の例で言えばMacにおけるPowerPCからIntel Macへの移行、あるいはx86からx86_64への移行など)) にLLVMビットコードがあればアップル側で自動的に変更後のアーキテクチャーにも対応できるようになる可能性があるという利点がある。

注意点

ただし、注意点がある。Xcode 6以前で作成したiOS向けプロジェクトでもXcode 7で開く際はデフォルトでビットコードを含むように設定される。また、ビットコードを有効にした状態でビルドする場合は、ソースコードのみならず、リンクしているライブラリーのすべてがビットコードを含んでいなければならないため、サードパーティーののライブラリーをリンクしている場合は要注意である。Xcode 7リリースからしばらくの間はサードパーティーのライブラリーはビットコードを含んでいないのがほとんどであるため、通常はリンク時に以下のようなエラーが発生する。

ld: ‘ライブラリーファイル名(ライブラリー内のオブジェクトファイル名)’ 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. for architecture (アーキテクチャー名)

この場合、プロジェクトのうち、「Build Settings」より、「Enable Bitcode」を「No」にすることでビルドが通るようになる。ただし、この場合はビットコードを含むことによる利点を享受できないため、なるべく早い段階でビットコードを含んだライブラリーに差し替えるなどの対策をとったほうがよいだろう。

最後に

iOS 9及びOS X El Capitanは見た目上の変更は思ったよりかは少ないものの、内部面での変更が地味に多く、特にセキュリティー面や互換性確保などの変更が多く、それに伴ってXcodeでの設定でも気をつけなければならないところが多い。

とはいえ、どういう点を気をつければいいのかがわかれば対処困難なものは少ないので、iOS9及びEl Capitanへの対応はサクサク進めたいところである。

2015年9月25日追記

Xcode 7において、デフォルトでビットコードが含まれるようになるのはiOS向けのアプリ/ライブラリー/フレームワークのみであり、少なくともYosemite環境においては、OS X向けのアプリ/ライブラリー/フレームワークはデフォルトではビットコードが含まれない状態だった ((追記時点ではEl Capitanでは確認していないため、そちらでの確証は得られていないが)) 。

コメント

  1. […] Xcode 7ではデフォルトでビルド時にビットコードが含まれる | Project Flora [iOS7][Xcode] […]

タイトルとURLをコピーしました