PEEE802.11

モバイルソフトウェアエンジニアの備忘録

ARM上でBoost::shared_ptrがリンクエラー

armでlibgnustl_shared.soをSTLとしてリンクし、boost_1_55_0でshared_ptrを使うと、undefined referenceのエラーが出る。AndroidGNU STLAndroid NDK標準のSTLと違って基本的にほぼx86用同等だと思っていたけど…と思っていたら以下に解決策があった。

https://legacy.madewithmarmalade.com/jp/node/52963

コンパイルするコードのどこかに、

namespace boost {
  void throw_exception( std::exception const & e ) { }
}

と書けばOK。自分のAndroid環境では上記URLに書いてあるBOOST_NO_EXCEPTIONSをdefineしなくてもOKだった。これでshared_ptrが使える。もちろん他のboostの便利機能splitとかlexical_castとかtrimとかも。

そもそもC++11でビルドすればstd::shared_ptrが使えるはずなんだけど、-std=c++0x 付けると::uint64_tがundefinedだのなんだのたくさんエラーが出てきた。g++ 4.6ではC++11の機能が全部カバーされてるわけではないようなので(下記URL)、とりあえず当面はC++11はDisableにしておく。

http://gcc.gnu.org/gcc-4.6/cxx0x_status.html