C ++ 11 funciones cmath no en el espacio de nombres std para android NDK w / gcc-4.8 o clang 3.4

Después de C ++ 11, varias funciones cmath previamente en el espacio de nombres global se mueven al std nombres std , al incluir el encabezado <cmath> .

Sin embargo, la compilación de NDK de Android tiene problemas con esto, con cadenas de herramientas gcc-4.8 y clang-3.4.

El indicador C++11 se especifica correctamente, ya que otros detalles de c ++ 11 como unique_ptr funcionan unique_ptr .

Si intento utilizar std::round , o std::cbrt , el compilador dice que estos no existen en std:: namespace, que deberían [1]. Existen en el espacio de nombres global, pero no quiero usarlos.

¿Se trata de un problema conocido? ¿He pasado por alto algo? ¿Hay soluciones?

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


  • La compilación de escritorio no tiene este problema con gcc-4.8.1, y uso las advertencias de gcc al máximo con -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

  • Comando de compilación relevante, en todo su esplendor: /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.od -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 /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.od -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

Esto parece ser un problema conocido con soporte de C ++ 11 en android. Existe un problema conocido que indica que faltan muchas de las rutinas:

Al compilar código c ++ con -std=c++11 y usar gnustl_shared , muchas funciones matemáticas C99 no son proporcionadas por el <cmath> como deberían.

Probablemente es mejor suponer que sólo un subconjunto limitado de la biblioteca c ++ está disponible para android, esto parece estar indicado en el archivo CPLUSPLUS-SUPPORT.html en el archivo docs/ para el ndk.

Cuidado con usted cuando tengo:

 APP_STL := c++_static 

En mi Application.mk y

 LOCAL_CPPFLAGS := -std=c++11 

En mi Android.mk , entonces los archivos que utilizan std::cbrt y std::round compilarán de manera limpia; Pero está en contra de la LLVM estática libc ++, en lugar de contra la biblioteca estándar de gnu.

Si realmente faltan funciones, hay que escribirlas usted mismo (o copiarlas de alguna otra implementación).

En el Android NDK, algunas funciones parecen estar allí, pero fuera de namespace std de namespace std . He trabajado alrededor del mismo problema para la función round añadiendo una round función a namespace std de namespace std , que apenas cae detrás en la función round del alcance global.

 namespace std { inline int round(float x) { return ::round(x); } } 

Si desea utilizar esto de una manera portátil, tendría que proteger esto con macros de preprocesador.

  • No se pueden incluir encabezados de C ++ como vector en Android NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.