在 Android 上完成 C++11 支持
Complete C++11 support on Android
我目前正在尝试交叉编译我之前开发的跨平台库,以便在 Android 上使用它。
为此,我使用了 NDK 提供的 arm-linux-androideabi-g++ (4.9) 编译器,并且我 link NDK 中也存在 gnu-libstdc++。
遗憾的是,由于使用了某些 C++11 功能,编译不会成功。
这些功能是 "string.h" 中的特定方法,如 std::to_string 或 std::stof,如果需要,可以很容易地用其他方法替换。
但我也使用更复杂的,比如来自 "future.h" 的东西,例如 std::future 和 std::async.
我找到了 "string.h" 编译错误的原因,在文件 "ndk/sources/cxx-stl/gnu-libstdc++/4.9/bits/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 交叉编译器怎么样?
谢谢。
我终于找到了解决这个问题的方法。
首先,"future.h" 方法的使用完全由 android NDK 提供的 gnu-libstdc++ 支持,我只是错过了一些允许使用它的包含,我的错。
接下来,我深入研究了我的库,发现真正导致编译错误的唯一方法是 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 方法,也可以覆盖它们。
我目前正在尝试交叉编译我之前开发的跨平台库,以便在 Android 上使用它。 为此,我使用了 NDK 提供的 arm-linux-androideabi-g++ (4.9) 编译器,并且我 link NDK 中也存在 gnu-libstdc++。
遗憾的是,由于使用了某些 C++11 功能,编译不会成功。 这些功能是 "string.h" 中的特定方法,如 std::to_string 或 std::stof,如果需要,可以很容易地用其他方法替换。 但我也使用更复杂的,比如来自 "future.h" 的东西,例如 std::future 和 std::async.
我找到了 "string.h" 编译错误的原因,在文件 "ndk/sources/cxx-stl/gnu-libstdc++/4.9/bits/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 交叉编译器怎么样?
谢谢。
我终于找到了解决这个问题的方法。
首先,"future.h" 方法的使用完全由 android NDK 提供的 gnu-libstdc++ 支持,我只是错过了一些允许使用它的包含,我的错。
接下来,我深入研究了我的库,发现真正导致编译错误的唯一方法是 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 方法,也可以覆盖它们。