android - 在使用 Android NDK r10e 构建静态库时“无效使用 'auto'”

标签 android c++ c++11 android-ndk cmake

我正在为 android 构建一些 C++ 项目,以便在 unity 插件上使用它。我成功为 iOS 编译,但我在 android 上收到以下错误:

~/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/stl_algo.h:3789:14: error: invalid use of 'auto'

~/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include/future:114:11: error: declaration of 'class std::future<void>'
 class future;

我正在使用 android-ndk-r10e 和这个 CMakeLists.txt 代码:

cmake_minimum_required(VERSION 2.8)
project(PluginAndroid)

# Android configuration
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 19) # API level
set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a)
set(CMAKE ANDROID_STL_TYPE stlport_static)
set(CMAKE_ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-4.8)
set(CMAKE_CXX_STANDARD 11)


include_directories ("${PROJECT_SOURCE_DIR}/3rdParty/common/")
....

file(GLOB source_files
    "*.h"
    "*.cpp"
)

add_library(PluginAndroid STATIC ${source_files})

有解决这个问题的线索吗?

最佳答案

正如评论中指出的那样 CMAKE_CXX_STANDARD从 CMake 3.1 版开始可用(如果您使用的是 firefox,请参阅我的附加组件 here 以查看从哪个版本开始可以使用 cmake 功能),因此您应该更改所需的最低版本。

此外,您应该使用 CMAKE_CXX_STANDARD_REQUIRED 将标准标记为必需的.

最后,你应该使用 target_compile_features确保您的编译器支持 auto 关键字(gcc 4.9 不提供对 C++11 功能的完全支持)。

这是您的 CMake 文件的修改版本:

cmake_minimum_required(VERSION 3.1)
project(PluginAndroid)

# Android configuration
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 19) # API level
set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a)
set(CMAKE ANDROID_STL_TYPE stlport_static)
set(CMAKE_ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-4.8)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include_directories ("${PROJECT_SOURCE_DIR}/3rdParty/common/")
....

file(GLOB source_files
    "*.h"
    "*.cpp"
)

add_library(PluginAndroid STATIC ${source_files})
target_compile_features(PluginAndroid PUBLIC cxx_auto_type)

无关,但请注意,documentation 中不推荐使用GLOB 来收集源文件:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

关于android - 在使用 Android NDK r10e 构建静态库时“无效使用 'auto'”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44775371/

相关文章:

android进度对话框背景颜色

android - Android FragmentTransaction.remove无法正常工作

C++ 从共享内存读取

c++ - 使用默认打印行为在 C++ 中重新路由 Lua 打印

multithreading - 动态分配的实现类 std::async-ing 其成员

java - 谷歌地图加载覆盖异步时强制关闭

java - 如何读取/写入用户定义的照片主题标签

c++ - 使用 gcc 4.8.4/clang3.4 编译 Nana 示例 (nana v1.1.2/1.1.3) 时出错

c++ - 使用 std::try_to_lock 的意外行为

c++ - enable_shared_from_this 必须是第一个基类吗?