C++ 11 cmath函数不在android NDK w/gcc-4.8或clang 3.4的std命名空间中

swa*_*log 12 c++ android stl android-ndk c++11

在C++ 11之后,当包括头部时,cmath先前在全局命名空间中的各种函数被移动到std命名空间<cmath>.

然而,android NDK构建存在问题,包括gcc-4.8和clang-3.4工具链.

C++11标志被正确地指定,如其他C++ 11详情等unique_ptr工作正常.

如果我试图使用std::round,或者std::cbrt,编译器说这些在std::命名空间中不存在,他们应该[1].它们存在于全局命名空间中,但我不想使用它们.

这是一个已知的问题?我忽略了什么吗?有变通方法吗?

[1] http://en.cppreference.com/w/cpp/header/cmath


  • 使用gcc-4.8.1桌面版本没有这个问题,我最充分地使用gcc警告 -Wall -Wextra -Wcast-align -Wcast-qual -fpermissive -Wconversion -Wdisabled-optimization -Weffc++ -Wfloat-equal -Wformat=2 -Wimport -Winit-self -Winline -Winvalid-pch -Wlong-long -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wpacked -Wpointer-arith -Wredundant-decls -Wshadow -Wstack-protector -Wstrict-aliasing=2 -Wunreachable-code -Wunsafe-loop-optimizations -Wunused -Wvariadic-macros -Wwrite-strings -pedantic -pedantic-errors -Woverloaded-virtual -Wswitch-enum -Werror

  • 相关的构建命令,尽在其中: /opt/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/main/__/android/jni/src/main.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/src/../android/jni/SDL/include -Ijni/src/../android/jni/SDL_image -Ijni/src/../android/jni/SDL_mixer -I/opt/bullet/bullet-2.82/include/bullet -I/opt/glm/glm-0.9.5.2 -I/opt/android-ndk-r9d/sources/android/cpufeatures -Ijni/SDL/include -Ijni/SDL_image -Ijni/SDL_image/external/jpeg-9 -Ijni/SDL_image/external/libpng-1.6.2 -Ijni/SDL_mixer -Ijni/SDL_mixer/external/libmodplug-0.8.8.4/src -Ijni/SDL_mixer/external/libmodplug-0.8.8.4/src/libmodplug -Ijni/SDL_mixer/external/smpeg2-2.0.0 -Ijni/SDL_mixer/external/libogg-1.3.1/include -Ijni/SDL_mixer/external/libvorbisidec-1.2.1 -I/opt/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/include -I/opt/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/include -I/opt/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/include/backward -Ijni/src -DANDROID -fno-strict-aliasing -D_REENTRANT -DGLM_FORCE_RADIANS -isystem /opt/glm/glm-0.9.5.2 -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -I/opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/include -c jni/src/../android/jni/src/main.cpp -o ./obj/local/armeabi/objs/main/__/android/jni/src/main.o

Pet*_*esh 4

这似乎是 Android 上 C++11 支持的一个已知问题。有一个已知问题表明缺少许多例程:

-std=c++11当使用 和 using编译 C++ 代码时gnustl_shared,头文件中并未提供许多 C99 数学函数<cmath>

您最好假设只有有限的 C++ 库子集可用于 android - 这似乎在ndk 的CPLUSPLUS-SUPPORT.html文件中有所指示。docs/

当我有以下情况时请注意:

APP_STL := c++_static
Run Code Online (Sandbox Code Playgroud)

在我Application.mk

LOCAL_CPPFLAGS  := -std=c++11
Run Code Online (Sandbox Code Playgroud)

在 my 中Android.mk,然后文件使用std::cbrtstd::round干净地编译;但它是针对静态LLVM libc++,而不是针对gnu 标准库。