【问题标题】:Set ANDROID_STL in CMakeLists在 CMakeLists 中设置 ANDROID_STL
【发布时间】:2017-02-06 09:46:58
【问题描述】:

我正在 Android Studio 2.2 中编译 C++ 库代码。我遵循新指南,将所有文件添加到我的项目中并使用 CMake(和 CMakeLists.txt)编译它,例如 this。我想使用 C++14 功能,以及 atomic、stoi 等内容,但构建失败并出现错误。

error: no type named 'condition_variable' in namespace 'std'
error: no member named 'stoi' in namespace 'std'

这就是我的 CMakeLists 的样子(其他行设置源文件和其他内容):

find_library(GLES GLESv2)
include_directories(${COMMON_PATH} /usr/local/include)
set(ANDROID_STL "c++_shared")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -latomic")

add_library(native-lib SHARED ${COMMON_SRC})
target_link_libraries(native-lib ${GLES})

我在 android 页面 (here) 上找到了这篇文章,但我不知道在使用 CMakeLists 而不是 ndk-build 时如何以及是否可以做到这一点。我看到使用 c++_static 运行时解决它的其他问题,但仅使用 ndk-build。

【问题讨论】:

  • 您是否尝试过按照here 的描述从您的 gradle 脚本中设置它?
  • 您是否尝试按照here 的描述设置CMAKE_CXX_STANDARD

标签: android c++ android-ndk cmake


【解决方案1】:
  • 这个documentation 对于 cmake 的情况会更有用: arguments "-DANDROID_STL=c++_shared
  • Gradle 在使用c++_shared 时也会将libc++_shared.so 打包到APK 中;在早期版本的 Android 操作系统上绕过 Gradle 可能会导致您的应用出现问题。

在提出这个问题的时候,Android Studio 可能有问题;当时现在Android Studio 3.1.3,应该没问题

【讨论】:

    【解决方案2】:

    用于生成 Android 原生库的交叉编译过程使用来自 NDK 库的 c++ 依赖项。谷歌提供的NDK不错,东西很多,但是对C++11和C++14的支持还不完善。

    如果您想使用 C++14 功能,您可以使用其他 NDK,例如 CrystaX NDK。使用 CrystaX,您还可以获得 C++17 支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2017-10-16
      • 2020-05-01
      • 1970-01-01
      • 2021-09-21
      • 2020-04-20
      相关资源
      最近更新 更多