无法解析带有 NDK r10e 的 std::chrono

Posted

技术标签:

【中文标题】无法解析带有 NDK r10e 的 std::chrono【英文标题】:std::chrono with NDK r10e could not be resolved 【发布时间】:2016-06-23 14:46:38 【问题描述】:

不要以为我没有搜索,我的 android 项目(在 Eclipse 上)拒绝识别 std::chrono 库。包含在我的头文件中是可以的:

#include <chrono>

但是当我想使用它时:

using namespace std::chrono;

我有一个:符号“chrono”无法解析,chrono 的所有功能都不可用。 所以我使用 NDK r10e,我在我的 Application.mk 中添加了一些行,现在看起来像这样:

APP_PLATFORM := android-22
APP_STL := gnustl_static
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.8

在我的 Android.mk 中,我添加了:

LOCAL_CFLAGS += -std=gnu++11

它没有解决我的问题。有任何想法吗 ? Eclipse 配置错误? 在修改 mk 文件后,我已经构建并重新构建了我的项目。

【问题讨论】:

如果你使用-std=c++11而不是-std=gnu++11,有什么不同吗? 我试过了,没区别... 【参考方案1】:

这是 Android NDK 中 GNU libstdc++ 的已知问题。它建立在非常有限的 libc(Google 的 Bionic)之上,因此无法提供完整的 C++ 标准库功能。特别是,std::chrono 在构建时几乎完全被禁用,而不仅仅是std::chrono。有许多其他类和函数被禁用,因此 Google 的 NDK 不完全支持 C++。

您可以切换到 LLVM libc++ (APP_STL := c++_static),但它在 Google 的 Android NDK 中处于实验状态,实际上是不稳定的(即,即使对于完全标准的 C++ 代码,它也会导致应用程序崩溃)。这种不稳定性的原因与 GNU libstdc++ 的原因相同 - 即因为它是建立在非常有限的 libc 之上的。

我建议切换到CrystaX NDK - Google 的 Android NDK 的替代分支,我开始主要是为了解决 Google 的 NDK 问题,例如 libc、libc++ 等的非标准实现。CrystaX NDK 是为工作而开发的作为谷歌 NDK 的替代品(除了它提供完全符合标准的低级库的事实)。在 CrystaX NDK 中,GNU libstdc++ 和 LLVM libc++ 都更加稳定,并且完全符合 C++ 标准,至少与它们在 GNU/Linux 上的标准相同。特别是,std::chrono 在那里完全实现并且工作得很好。此外,在 CrystaX NDK 中,您可以使用更新的编译器,例如 gcc-5.3 和 clang-3.7,更好地支持 C++11 和 C++14。如果对你有帮助,我会很高兴。

【讨论】:

感谢您的回答,但它不起作用... std::chrono 总是未知的。我对 c++ 不满意,CrystaX NDK 使我的应用程序崩溃,它编译(当我评论 chrono 时)但不运行(在 NDK 文件夹中找不到文件)。但是,我把它放在一边以备将来,现在没有时间。 Android NDK r10e 切换到c++_static 后不起作用?或者切换到 CrystaX NDK 时它不起作用?无论如何,在这两种情况下,我都确定您做错了什么,因为std::chrono 在这两种情况下都绝对可以访问。您的 Application.mk 或 Android.mk 可能有问题。我看到你已经推迟了这个,但是如果你决定回到它,我建议首先构建简单的案例,看看它是否有效(实际上应该),然后切换到更复杂的案例。 我刚尝试切换到c++_static,我的Eclipse不支持,不知道为什么...关于CrystaX,我确定你是对的,我做点什么错了,但是什么?下一次,我会照你说的做:一个简单的例子。谢谢

以上是关于无法解析带有 NDK r10e 的 std::chrono的主要内容,如果未能解决你的问题,请参考以下文章

带有 Google 测试的 Android NDK

Eclipse中NDK无法编译(哪怕是一个新建的空白项目)

带有ndk平台错误帮助'_IOR'的c ++未在此范围内声明

如何在带有 opencv 的 NDK 中使用 meanshift?

Android 中的 NDK 到底是什么?(详细解析+案例实战)

googleapis / python-bigquery:BadRequest:无法解析为带有消息“无法解析”的日期