Intereting Posts

C ++ 11 cmath не в пространстве имен std для android NDK w / gcc-4.8 или clang 3.4

После C ++ 11 различные функции cmath ранее в глобальном пространстве имен перемещаются в пространство имен std при включении заголовка <cmath> .

Однако у сборника Android NDK есть проблемы с этим: с инструментами gcc-4.8 и clang-3.4.

Флаг C++11 правильно указан, так как другие c ++ 11 unique_ptr таких как unique_ptr работают нормально.

Если я пытаюсь использовать std::round или std::cbrt , компилятор говорит, что они не существуют в std:: namespace, и они должны [1]. Они существуют в глобальном пространстве имен, но я не хочу их использовать.

Это известная проблема? Я что-то пропустил? Есть ли обходные пути?

[1] http://ru.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.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

Solutions Collecting From Web of "C ++ 11 cmath не в пространстве имен std для android NDK w / gcc-4.8 или clang 3.4"

Это, похоже, известная проблема с поддержкой C ++ 11 на Android. Существует известная проблема , указывающая на то, что отсутствует множество подпрограмм:

При компиляции кода c ++ с -std=c++11 и с использованием gnustl_shared многие математические функции C99 не предоставляются заголовком <cmath> как и должны.

Вероятно, вам лучше предположить, что для андроида доступно только ограниченное подмножество библиотеки c ++ – это, как представляется, указано в CPLUSPLUS-SUPPORT.html в docs/ для ndk.

Имейте в виду, когда я:

 APP_STL := c++_static 

В моих Application.mk и

 LOCAL_CPPFLAGS := -std=c++11 

В моем Android.mk , тогда файлы, использующие std::cbrt и std::round компилируются чисто; Но он против статического LLVM libc ++, а не против стандартной библиотеки gnu.

Если функции действительно отсутствуют, вы должны сами написать их (или скопировать их из другой реализации).

В Android NDK некоторые функции, похоже, существуют, но только вне namespace std . Я работал над той же проблемой для функции round , добавив функцию round в namespace std , которая просто возвращается к round функции из глобальной области.

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

Если вы хотите использовать это в переносном режиме, вам придется защищать его с помощью макросов препроцессора.