Android NDK CMake使用C ++ 17

Sci*_*dix 5 android cmake android-ndk clang++ c++17

问题

我想在我的Android NDK项目中使用分解声明。因此clang需要用调用-std=c++17。目前,我的代码可以正确编译,但是Clang打印以下警告:

warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]
Run Code Online (Sandbox Code Playgroud)

我所知道的和我想要的

在构建日志中,我发现它-std=...四次附加到构建标志:

[...]/bin/clang++ [...] -Wformat -Werror=format-security -std=c++11 -std=c++1z\
    -fexceptions -std=c++1z -Wall -O0 -fno-limit-debug-info  -fPIC\
    -std=gnu++11 -MD -MT [...]
Run Code Online (Sandbox Code Playgroud)

我知道第二个和第三个标志来自哪里(见下文)。我试图将它们更改为-std=c++17-std=c++1z但没有成功。

我猜以后的标记会覆盖以前的标记。所以我真的不在乎第一个。但是我不知道最后一个(-std=gnu++11)的来源以及如何停用或修改它。我也猜想它gnu++11不是c++11激活某些GNU扩展,导致我只得到警告而没有错误的情况。

但是我不能确定。不过,我想要“真正的” C ++ 17支持,而不仅仅是一些GNU扩展。我也想摆脱警告。

构建过程中涉及的文件

我的 gradle.build

cppFlags此处的切换是上述构建日志摘录中第二个标志的来源。我知道这里的某些版本已过时。但是我是从NDK示例存储库中获得的,而且我是Android编程的新手。我还在弄清楚事情是如何进行的。所以我现在还不在乎那部分。

apply plugin: 'com.android.application'

android {
    compileSdkVersion = 25

    defaultConfig {
        applicationId = 'com.example.stackoverflow'
        minSdkVersion 14
        targetSdkVersion  25
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_STL=c++_static'
                cppFlags "-std=c++1z -fexceptions"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path 'src/main/CMakeLists.txt'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:25.4.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.1'
}
Run Code Online (Sandbox Code Playgroud)

我的 CMakeLists.txt

第三个标志的来源。cmrc_add_resource_libraryassets/CMakeRC.cmake编译资源。我搜索了代码,没有与std=*或相关的信息CMAKE_*_FLAGS。如果您不相信我自己,请参阅源代码

cmake_minimum_required(VERSION 3.4.1)
include(assets/CMakeRC.cmake)

# Build native_app_glue as a static library
set(${CMAKE_C_FLAGS}, "${CMAKE_C_FLAGS}")
add_library(native_app_glue STATIC
    ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)

# Now build app's shared library
cmrc_add_resource_library(shaderFiles assets/shader/standard.fs assets/shader/standard.vs)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall")

# Export ANativeActivity_onCreate(),
set(CMAKE_SHARED_LINKER_FLAGS
    "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")

add_library(myappname SHARED
            cpp/main.cpp
            #cpp files...

target_include_directories(myappname PRIVATE
    ${ANDROID_NDK}/sources/android/native_app_glue)

# Add library dependencies
target_link_libraries(myappname
    shaderFiles
    android
    native_app_glue
    EGL
    GLESv2
    log)
Run Code Online (Sandbox Code Playgroud)

我项目中的其他文件均未包含与构建标志远程相关的代码。所以我想就这些了。

主要问题

最后一个-std=标记从何而来?如果以上问题描述不足以得出解决方案,那么我可以采取哪些进一步的步骤来找出问题的出处?也许我弄错了,clang++已经用C ++ 17编译了。但是,为什么我会收到这些警告?我该如何摆脱它们?

更新资料

我在本地Android SDK文件夹中搜索std=gnu++11并尝试连续更改所有出现的内容,以找出在构建过程中使用的是哪一个。事实证明,cmake/3.6.4111459/share/cmake-3.6/Modules/Compiler/Clang-CXX.cmake该变量CMAKE_CXX11_EXTENSION_COMPILE_OPTION负责上述编译器标志。我当前的解决方法是将其设置为所需的标准CMakeLists.txt

set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++17")
Run Code Online (Sandbox Code Playgroud)

这可行。我摆脱了所有警告。但是,这似乎有点hacky,但我仍然不知道将这个变量实际附加到build命令的任何线索。因此,由于我仍在寻找实际的解决方案,因此我没有将其发布为答案。但是,如果有人遇到同样的问题,并且只是在寻找快速解决方案,那么,您就可以!

Dan*_*ert 4

NDK 的工具链文件遵循-std应有的设置。这两个标志都会出现,但它们的显示顺序是用户的设置覆盖工具链。

听起来你的构建中有类似的东西target_compile_features(foobar PRIVATE cxx_range_for)set_property(TARGET foobar PROPERTY CXX_STANDARD 11)某个地方。