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.
- ¿Cuál es el comportamiento si una aplicación de Android NDK carga más de una implementación compartida de STL de C ++?
- Std :: map linker error ndk r8c con APP_STL: = gnustl_static
- Uso de NDK con STL en Android Studio gradle project
- Excepciones de Android NDK y C ++: estado actual?
- Vinculación de la compilación de la biblioteca con ndk r10 en la compilación del proyecto con ndk r13 utilizando c ++ _ stl compartido
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
- Manejo de excepciones de Android NDK
- Distribuir la biblioteca NDK con gnustl?
- Uso de la STL con Android NDK C ++
- ¿Por qué los subprocesos nativos se comportan de forma diferente cuando la aplicación está en segundo plano?
- Compilación de STXXL bajo Android NDK r8b
- Android NDK STL c ++ _ compartido con resultados LIBCXX_FORCE_REBUILD en std :: stringstream NOP
- Vinculación de STL a un ejecutable NDK independiente de Android
- ¿Cuál es la diferencia entre gnustl y stlport en el desarrollo android ndk?
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 usargnustl_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.
- Cómo detectar mediante programación SONY – El perfil de energía del dispositivo de resistencia está activado
- ¿Cuáles son las ventajas de usar Jack y Jill?