【问题标题】:Android Application.mk settings to be able to use c++11 <random> and dynamic_castAndroid Application.mk 设置能够使用 c++11 <random> 和 dynamic_cast
【发布时间】:2016-01-19 03:38:30
【问题描述】:

在 Application.mk 文件中,当使用 APP_STL := stlport_static 我可以使用 c++11 dynamic_cast 但它不会编译“随机”功能。

我已经尝试过 APP_STL := gnustl_static 和 APP_STL := c++_static 但它们不允许我使用 dynamic_cast。

Application.mk 的正确设置是什么才能同时使用两者?

我当前的 Application.mk 看起来像:

APP_CPPFLAGS += -std=c++11
APP_STL := stlport_static 
APP_ABI := armeabi armeabi-v7a x86

编辑:

按照 Michaels 的指示,最终运行的 Application.mk 是:

#LIBCXX rebuild was needed once when using APP_STL := c++_static
LIBCXX_FORCE_REBUILD := true
APP_CPPFLAGS += -std=c++11 -frtti -fexceptions
APP_STL := c++_static
#Also the gnu compiler can be used
#APP_STL:= gnustl_static
APP_ABI := armeabi armeabi-v7a x86
NDK_TOOLCHAIN_VERSION := 4.8

【问题讨论】:

标签: android c++11 random java-native-interface dynamic-cast


【解决方案1】:

听起来您忘记启用 RTTI,dynamic_cast 使用它来执行运行时类型检查。

引用the documentation:

[为了]确保与早期版本的兼容性,[NDK 工具链]默认使用 -fno-rtti 编译所有 C++ 源代码。

要为整个应用程序启用 RTTI 支持,请将以下行添加到 Application.mk 文件中:

APP_CPPFLAGS += -frtti

我在 stlport 源中没有看到任何 random 标头,因此它可能不支持该功能。请改用其他 STL 实现,例如 gnustl。

所以你需要的是这样的:

APP_CPPFLAGS += -std=c++11 -frtti
APP_STL := gnustl_static 

【讨论】:

  • 我认为修复了 dynamic_cast 的使用,但现在我收到了这个错误:ndk/sources/cxx-stl/llvm-libc++/libcxx/include/atomic:922: error: undefined reference to '__atomic_fetch_add_4'。恐怕它与配置无关。
  • 您需要将-latomic 添加到您的LOCAL_LDFLAGS
  • 它适用于 gnustl_static 但不适用于 c++_static。为什么会这样?
  • 什么不适用于 c++_static?以及针对哪些 ABI?您使用的是哪个 NDK 版本和 NDK 工具链?
  • -latomic 标志不起作用:我正在使用:ndk-r10e、NDK_TOOLCHAIN_VERSION := 4.8 和 APP_ABI := armeabi
猜你喜欢
  • 2016-04-02
  • 2023-01-19
  • 1970-01-01
  • 2016-06-25
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2013-05-11
相关资源
最近更新 更多