在Android上完全支持C ++ 11

时间:2015-04-01 17:02:07

标签: android c++11 android-ndk cross-compiling

我目前正在尝试交叉编译我之前开发的跨平台库,以便在Android上使用它。 为此,我使用NDK提供的arm-linux-androideabi-g ++(4.9)编译器,并链接NDK中也存在的gnu-libstdc ++。

不幸的是,由于使用了一些C ++ 11功能,编译不会成功。 这些特征是" string.h"中出现的特定方法。比如std :: to_string或std :: stof,如果必须的话,可以很容易地被其他的替换掉。 但我也使用更复杂的东西,比如来自" future.h"例如std :: future和std :: async。

我在文件" ndk / sources / cxx-stl / gnu-libstdc ++ / 4.9 / bits /中找到" string.h"的编译错误的原因basic_string.h",以下语句返回false(_GLIBCXX_USE_C99未定义):

 //basic_string.h 

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

 //methods I want to use

 #endif

根据我的理解,这些限制是由Android Bionic libc引起的。

我有什么选择来解决这个问题?

我已经尝试过使用CrystaX NDK,但它只解决了我的" string.h"问题,我宁愿找到更标准的解决方案。

如何使用不特定于Android的ARM交叉编译器?

感谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决这个问题的方法。

首先,android NDK提供的gnu-libstdc ++完全支持“future.h”方法的使用,我只是错过了一些允许其使用的内容,我的不好。

接下来,我深入研究了我的库,我发现实际导致编译错误的唯一方法是std :: to_string。 所以我决定简单地用以下内容覆盖它:

#if __ANDROID__

namespace std {
  #ifndef to_string
  inline string to_string(int _Val)
  {    // convert int to string
      char _Buf[256];
      sprintf(_Buf, "%d", _Val);
      return (string(_Buf));
  }
  #endif
}

#endif

我想如果有其他一些不受支持的C ++ 11方法,也可以覆盖它们。