Android NDK CMake использует C ++ 17 - PullRequest
0 голосов
/ 25 мая 2018

Проблема

Я хотел бы использовать объявления декомпозиции в своем проекте Android NDK.Поэтому clang нужно вызывать с -std=c++17.В настоящее время мой код компилируется без ошибок, но Clang выводит следующее предупреждение:

warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]

Что я знаю и чего хочу

В журнале сборки я заметил, что -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 [...]

Я знаю, откуда берется второй и третий флаг (см. ниже).Я попытался изменить их на -std=c++17 и -std=c++1z, но безуспешно.

Я думаю, что более поздние флаги переопределяют более ранние.Так что мне плевать на первый.Но я не могу понять, откуда взялся последний (-std=gnu++11) и как я могу его деактивировать или изменить.Кроме того, я предполагаю, что тот факт, что gnu++11 вместо c++11 активирует некоторое расширение GNU, приводит к тому, что я получаю только предупреждения и никаких ошибок.

Но я не могу сказать наверняка.Тем не менее, я хочу «настоящую» поддержку C ++ 17, а не только некоторые расширения GNU.Также я хочу избавиться от предупреждений.

Файлы, участвующие в процессе сборки

My 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'
}

Мой CMakeLists.txt

Происхождение третьего флага.cmrc_add_resource_library из assets/CMakeRC.cmake компилирует ресурсы.Я искал код, и ничего не связано с std=* или CMAKE_*_FLAGS.Если вы не верите мне, посмотрите на source .

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 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")

. Это работает.Я избавился от всех предупреждений.Однако это кажется немного странным, и я до сих пор не понимаю, что на самом деле добавляет эту переменную в команду сборки.Так что я не публикую это как ответ, так как я все еще ищу фактическое решение.Но если у кого-то есть такая же проблема, и он просто ищет быстрое решение, ну что ж, поехали!

1 Ответ

0 голосов
/ 10 июля 2018

Файл набора инструментов NDK соответствует настройкам -std, как и должно быть.Появятся оба флага, но они делают это в том порядке, в котором пользовательские настройки переопределяют цепочки инструментов.

Похоже, у вас есть что-то вроде target_compile_features(foobar PRIVATE cxx_range_for) или set_property(TARGET foobar PROPERTY CXX_STANDARD 11) где-то в вашей сборке.

...