首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android使用C++17

Android使用C++17
EN

Stack Overflow用户
提问于 2018-05-25 09:01:07
回答 2查看 9K关注 0票数 11

问题

我想在我的Android项目中使用分解声明。因此,clang需要与-std=c++17一起调用。目前,我的代码编译时没有错误,但是Clang会打印以下警告:

代码语言:javascript
复制
warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]

我知道的和我想要的

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

代码语言:javascript
复制
[...]/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 [...]

我知道第二个和第三个旗子是从哪里来的(见下文)。我试图将它们改为-std=c++17-std=c++1z,但没有成功。

我想以后的标志会超过以前的。所以我不关心第一个。但我不知道最后一个(-std=gnu++11)是从哪里来的,也不知道如何禁用或修改它。另外,我认为是gnu++11而不是c++11激活了一些GNU扩展,导致我只收到警告而没有错误。

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

构建过程中涉及的文件

我的gradle.build

此处的开关cppFlags是上面从构建日志中摘录的第二个标志的来源。我知道这里的一些版本已经过时了。但我是从NDK示例存储库中获得的,我对Android编程很陌生。我还在想事情是怎么运作的。所以我还不关心这部分。

代码语言:javascript
复制
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'
}

我的CMakeLists.txt

第三面旗帜的起源。cmrc_add_resource_libraryassets/CMakeRC.cmake编译资源。我搜索了代码,没有任何与std=*CMAKE_*_FLAGS相关的内容。如果你不相信我,你自己看看来源吧。

代码语言:javascript
复制
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)

我的项目中没有任何其他文件包含与构建标志有关的远程代码。所以我想仅此而已。

主要问题

最后一个-std=标志是从哪里来的?如果上面的问题描述不足以推断出一个解决方案,我还能采取什么进一步的步骤来找出问题的根源?也许我搞错了,clang++已经用C++17编译了,但是为什么我会收到这些警告呢?我该怎么摆脱他们?

更新

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

代码语言:javascript
复制
set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++17")

这个很管用。我消除了所有的警告。然而,这似乎有点麻烦,我仍然不知道到底是什么将这个变量附加到build命令中。所以我不会把这作为一个答案,因为我仍然在寻找一个实际的解决方案。但如果有人有同样的问题,只是在寻找一个快速的解决办法,好吧,给你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 23:06:41

NDK的工具链文件应该遵守-std设置。两个标志都会出现,但它们是按照用户设置覆盖工具链的顺序进行的。

听起来好像在您的构建中有类似于target_compile_features(foobar PRIVATE cxx_range_for)set_property(TARGET foobar PROPERTY CXX_STANDARD 11)的东西。

票数 4
EN

Stack Overflow用户

发布于 2019-09-29 20:42:52

向cmake传递参数应该作为一个列表来完成,而不是作为一个简单的字符串。我在我的一个项目中使用它来构建一个本机库:

代码语言:javascript
复制
    cmake {
          // Passes optional arguments to CMake. Make sure it is a list, not just a string :-) .
          arguments "-DANDROID_NATIVE_API_LEVEL=21", "-DANDROID_STL=c++_shared", "-DANDROID=true"
          cppFlags "-fexceptions", "-frtti"
          ...
    }

构建脚本使用简单的字符串,而不是列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50525346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档