无法解析带有 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的主要内容,如果未能解决你的问题,请参考以下文章
带有ndk平台错误帮助'_IOR'的c ++未在此范围内声明
如何在带有 opencv 的 NDK 中使用 meanshift?