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_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)
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命令的任何线索。因此,由于我仍在寻找实际的解决方案,因此我没有将其发布为答案。但是,如果有人遇到同样的问题,并且只是在寻找快速解决方案,那么,您就可以!
NDK 的工具链文件遵循-std
应有的设置。这两个标志都会出现,但它们的显示顺序是用户的设置覆盖工具链。
听起来你的构建中有类似的东西target_compile_features(foobar PRIVATE cxx_range_for)
或set_property(TARGET foobar PROPERTY CXX_STANDARD 11)
某个地方。
归档时间: |
|
查看次数: |
2727 次 |
最近记录: |