问题
我想在我的Android项目中使用分解声明。因此,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
第三面旗帜的起源。cmrc_add_resource_library从assets/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)我的项目中没有任何其他文件包含与构建标志有关的远程代码。所以我想仅此而已。
主要问题
最后一个-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中所需的标准。
set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++17")这个很管用。我消除了所有的警告。然而,这似乎有点麻烦,我仍然不知道到底是什么将这个变量附加到build命令中。所以我不会把这作为一个答案,因为我仍然在寻找一个实际的解决方案。但如果有人有同样的问题,只是在寻找一个快速的解决办法,好吧,给你!
发布于 2018-07-09 23:06:41
NDK的工具链文件应该遵守-std设置。两个标志都会出现,但它们是按照用户设置覆盖工具链的顺序进行的。
听起来好像在您的构建中有类似于target_compile_features(foobar PRIVATE cxx_range_for)或set_property(TARGET foobar PROPERTY CXX_STANDARD 11)的东西。
发布于 2019-09-29 20:42:52
向cmake传递参数应该作为一个列表来完成,而不是作为一个简单的字符串。我在我的一个项目中使用它来构建一个本机库:
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"
...
}构建脚本使用简单的字符串,而不是列表。
https://stackoverflow.com/questions/50525346
复制相似问题