【问题标题】:Complete C++11 support on Android在 Android 上完整的 C++11 支持
【发布时间】:2015-06-06 10:41:27
【问题描述】:

我目前正在尝试交叉编译我之前开发的跨平台库,以便在 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/basic_string.h”中找到了“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 交叉编译器怎么样?

谢谢。

【问题讨论】:

  • 我已经在android-ndk 群里回复你了,但是今天它的工作延迟很大,所以我的答案仍然没有出现在那里。关于 - 你能说得更详细些吗?阻止它的使用应该没有问题,所以要么是你的错误,要么是 CrystaX NDK 中的错误。如果它是错误,我们很乐意修复它,所以请让我知道究竟出了什么问题。顺便说一句,您可以使用我们的bug tracker 提交工单,我们会尽快解决问题。

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


【解决方案1】:

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

首先,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 方法,也可以覆盖它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2016-03-22
    • 2017-09-11
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多