XCode の boost を利用した開発で、特定のシュミレータ/Device 向けのビルドが失敗する

投稿者: Anonymous

XCode 6.1.1 で boost-1.57.0 を利用した iOS 向けのアプリを製作しています。

iOS シュミレータ iPhone 5s, 6, 6Plus, iPad Airでビルドする際には問題ないのですが、他シュミレータ、Deviceでビルドすると以下のような警告と大量の referenced from エラーが出てビルドできません。

他シュミレータでビルドした場合

Undefined symbols for architecture i386:

Device(iPhone 5S)でビルドした場合

ld: warning: ignoring file /Users/Himatya/src/boost/lib/libboost_serialization.a, 
file was built for archive which is not the architecture being linked (arm64): /Users/Himatya/src/boost/lib/libboost_serialization.a
Undefined symbols for architecture arm64:

どうすればビルドできるようになるでしょうか。

解決

(ライブラリの生成方法の参考情報ということで、)

Undefined symbols for architecture XXX: といっているので、iOS/Simulator 用のライブラリが無いのが原因だと思われます。

ライブラリの作成方法はいろいろありそうですが gist.github.com/faithfracture/boost.sh を参考にしてライブラリを生成すると、一気に Framework にしてくれるのでラクです。

リンクは 1.56.0 なので fork にある、こことかを使うと、1.57.0 になりそうなので、例えば、、

$ cd /tmp
$ curl https://gist.githubusercontent.com/pintaric/48c6772e6b0949ae9d06/raw/957daaee6fd9f62768f68ebb63902751dd410439/build_boost.sh > build_boost.sh  
$ sh ./build_boost.sh  
...

とすれば、しばらく待った後 /tmp/ios/framework/, /tmp/osx/framework/ 以下に boost.framework が出来るので、 TARGETS > General の Linked Frameworks and Libraries にフォルダごとドロップすれば良いはずです。

(/tmp は、通常、再起動時に消えるので、問題が無ければ必要に応じて環境にあった場所に救い出してください)

ビルドの際のハマリポイントとして、gcc が使われると駄目っぽいので、gcc をデフォルトにしている場合 $ sudo port select gcc none ( ports の場合) とでもして clang にしておく必要があります。

追記

上記で紹介しているスクリプトは、ビルドが失敗した場合、原因究明が難しい作りになっています。また、各々の環境や、将来にわたって動作するとは限らないので、問題があった場合、自身で build_boost.sh を修正するなどして調整してください。。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *