- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在我的 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!