std::experimental::对于 ndk/clang 是可选的

Posted

技术标签:

【中文标题】std::experimental::对于 ndk/clang 是可选的【英文标题】:std::experimental::optional with ndk/clang 【发布时间】:2019-05-09 16:11:25 【问题描述】:

我正在尝试构建使用std::experimental::optional 的项目。对于 Linux,它编译得很好,但对于 android/ndk,编译器会抛出:

error: no member named 'experimental' in namespace 'std'

我正在使用 polly 工具链 android-ndk-r17-api-24-armeabi-v7a-clang-libcxx14set(CMAKE_CXX_STANDARD 14) 进行构建

# Copyright (c) 2015-2018, Ruslan Baratov
# Copyright (c) 2017-2018, Robert Nitsch
# Copyright (c) 2018, David Hirvonen
# All rights reserved.

if(DEFINED POLLY_ANDROID_NDK_R17_API_24_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_)
  return()
else()
  set(POLLY_ANDROID_NDK_R17_API_24_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_ 1)
endif()

include("$CMAKE_CURRENT_LIST_DIR/utilities/polly_clear_environment_variables.cmake")

include("$CMAKE_CURRENT_LIST_DIR/utilities/polly_init.cmake")

set(ANDROID_NDK_VERSION "r17")
set(CMAKE_SYSTEM_VERSION "24")
set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a")
set(CMAKE_ANDROID_ARM_NEON TRUE)
set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM
set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang")
set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static

polly_init(
    "Android NDK $ANDROID_NDK_VERSION / \
API $CMAKE_SYSTEM_VERSION / $CMAKE_ANDROID_ARCH_ABI / \
Clang / c++14 support / libc++ static"
    "Unix Makefiles"
)

include("$CMAKE_CURRENT_LIST_DIR/utilities/polly_common.cmake")

include("$CMAKE_CURRENT_LIST_DIR/flags/cxx14.cmake") # before toolchain!

include("$CMAKE_CURRENT_LIST_DIR/os/android.cmake")

我尝试构建一个最小的示例:

#include <experimental/optional>
#include <iostream>

int main() 
    std::experimental::optional<int> b = 6;
    std::cout << b.value()  <<  std::endl;
    return 0;

但它使用相同的工具链构建得很好。

抱歉,我无法在此处发布我的代码。任何想法可能是什么问题?

【问题讨论】:

阅读github.com/android-ndk/ndk/issues/609 看起来它仍然是一个悬而未决的问题。 谢谢,这解释了我的问题。 【参考方案1】:

更新到 NDK r19 并使用 std::optional。它在 C++17 中不是实验性的。

【讨论】:

以上是关于std::experimental::对于 ndk/clang 是可选的的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::experimental::simd?

C++ VS 错误:提供 std::experimental::filesystem 的 <experimental/filesystem> 标头已被 Microsoft 弃用,并将被删除

如何在 C++ 中使用 std::optional ?

std::optional<T> 的开销?

没有 在MS Visual Studio 2013中 - 怎么做?

shellexecute的使用和X64判断