LoginSignup
11
11

More than 5 years have passed since last update.

Android NDK(gcc4.8) と std::stoi

Last updated at Posted at 2014-06-11

cocos2d-xはv3の安定性にまだ不安があるという理由で、v2.2.3を使用しています。

C++11で std::stoi を使いたい

それでも折角ならC++11でコーディングしたいと、そうしています。
XcodeでiOS向けに開発しているときは問題は無かったのですが、いざ、Android版をビルドしようとすると、以下のようなコードで問題が出ました。

#include <string>

auto number = std::stoi("123");

C++11対応

順を追って。

まず、C++11対応の設定。
Application.mk を編集して、"NDK_TOOLCHAIN_VERSION := 4.8"、"-std=c++11"を追加。

proj.android/jni/Application.mk
NDK_TOOLCHAIN_VERSION := 4.8
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11

ライブラリやインクルードファイルのパスも4.8にします。

ビルド

Console
jni/../../Classes/fp.cpp:692:9: error: 'stoi' is not a member of 'std'

そんなの知らないよとエラーになりました。

basic_string.h
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

定義されているソースを眺めると、以上のような条件になっています。
それぞれを確認すると、_GLIBCXX_USE_C99 がdefineされていません。

試しに、std::stoi を使用するコードの先頭で、

#define _GLIBCXX_USE_C99
#include <string>

と指定してビルドし直すと。

Console
.../android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/include/bits/basic_string.h:2961:31: error: 'wcstold' is not a member of 'std'

……、
これ以上時間をかけてもしようが無いと判断して、std::stoi の利用をやめました。
他で代替はききますし。

結論、解決せず

いまのところこの他に、C++11 での問題には遭遇していません。

この問題、というか制限でしょうか?
cocos2d-x では無く gcc の問題のようです。検索すると同じような質問が散見します。
ただ、なぜこうなるかという解説はあっても解決方法には至りませんでした。

なお、この問題に悩み始めてから、cocos2d-x v3.x.x が C++11ベースのコードになっていることを知りました。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11