gpt4 book ai didi

Android NDK CMake 使用 C++17

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:14 38 4
gpt4 key购买 nike

问题

我想在我的 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 扩展。我也想摆脱警告。

构建过程中涉及的文件

我的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

第三面旗帜的由来。 assets/CMakeRC.cmake 中的cmrc_add_resource_library 编译资源。我搜索了代码,没有与 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")

这行得通。我摆脱了所有警告。然而,它似乎有点老套,我仍然不知道实际上是什么将这个变量附加到构建命令。所以我不会将此作为答案发布,因为我仍在寻找实际的解决方案。但是,如果有人遇到同样的问题并且只是在寻找快速解决方案,那么,开始吧!

最佳答案

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

听起来您的构建中某处有类似 target_compile_features(foobar PRIVATE cxx_range_for)set_property(TARGET foobar PROPERTY CXX_STANDARD 11) 的内容。

关于Android NDK CMake 使用 C++17,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525346/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com