studio ndk android c++ stl android-ndk stxxl

studio - android ndk location



Compilando STXXL bajo Android NDK r8b (1)

Estoy tratando de compilar STXXL bajo Android NDK r8b (tengo el mismo problema bajo el nuevo r8c por cierto).

Estoy compilando usando gnustl_static.

Necesito compatibilidad con C ++ 11, así que inicialmente intenté configurar

LOCAL_CPPFLAGS := -std=c++11

pero esto arrojó un error sobre uint64_t.

Así que cambié la bandera a

LOCAL_CPPFLAGS :=-std=gnu++11

Esto ayuda un poco, pero cuando comienza a compilar recibo un error relacionado con el gnu stl.

Users/Gozzeh/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include -Ijni -DANDROID -Wa,--noexecstack -fexceptions -frtti -Dnullptr=0 -D_ANDROID -std=gnu++11 -Ijni/STXXL/include -fexceptions -O2 -DNDEBUG -g -I/Users/Gozzeh/android-ndk-r8b/platforms/android-8/arch-arm/usr/include -c jni/STXXL/algo/copy_and_sort_file.cpp -o ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o In file included from /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/set:60:0, from jni/STXXL/include/stxxl/bits/io/simdisk_file.h:33, from jni/STXXL/include/stxxl/bits/io/io.h:20, from jni/STXXL/include/stxxl/io:13, from jni/STXXL/algo/copy_and_sort_file.cpp:18: /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h: In member function ''std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, const _Val&)'': /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:1011:39: error: ''_Arg'' was not declared in this scope

También recibo una carga completa de más errores relacionados con este parámetro _Arg.

Entonces, al mirar el primero, la función tiene el siguiente aspecto:

template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> #ifdef __GXX_EXPERIMENTAL_CXX0X__ template<typename _Arg> #endif typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: #ifdef __GXX_EXPERIMENTAL_CXX0X__ _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, _Arg&& __v) #else _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) #endif { bool __insert_left = (__x != 0 || __p == _M_end() || _M_impl._M_key_compare(_KeyOfValue()(__v), _S_key(__p))); // This line is the error location. _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v)); _Rb_tree_insert_and_rebalance(__insert_left, __z, const_cast<_Base_ptr>(__p), this->_M_impl._M_header); ++_M_impl._M_node_count; return iterator(__z); }

Realmente no puedo entender dónde está surgiendo el problema. ¿GNU ++ 11 no define __GXX_EXPERIMENTAL_CXX0X__ ? ¿O es el problema de que no se está utilizando en algún lugar de forma adecuada? Estoy muy confundido en cuanto a lo que está causando el problema? Tengo STXXL compilando con gnu ++ 11 bajo clang en el iphone, pero supongo que ese iPhone probablemente esté usando una implementación diferente de STL. ¿Alguien tiene alguna idea sobre cómo puedo solucionar este problema?

Si necesita más información solo pregunte!

Editar: Por lo tanto, uno de los comentarios aquí es mi aplicación.mk

APP_PLATFORM := android-8 APP_STL := gnustl_static APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_OPTIM := release APP_ABI := all

y este es mi android.mk:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) LOCAL_MODULE := stxxl LOCAL_CPP_FEATURES += exceptions FILE_LIST := $(call rwildcard, $(LOCAL_PATH)/STXXL/,*.cpp) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_CPPFLAGS := -Dnullptr=0 -D_ANDROID -D__STDC_INT64__ -std=gnu++11 -I$(LOCAL_PATH)/STXXL/include include $(BUILD_SHARED_LIBRARY)

Editar: Curiosamente, intenté colocar una #error temp dentro del bloque #ifdef __GXX_EXPERIMENTAL_CXX0X__ en la función stl_tree.h que publiqué. El compilador NO arroja un error en esa parte ... por lo que la definición nunca se establece, que es, presumiblemente, la causa de mis problemas. También he agregado específicamente un -D__GXX_EXPERIMENTAL_CXX0X__ pero eso no hace ninguna diferencia (es como si no se tratara).


Creo que su enfoque para construir es demasiado optimista. No sé nada de STXXL, pero cualquier proyecto no trivial tiene muchos detalles en sus propios archivos make, por lo que lanzar tu propio Android.mk e intentar incluir todos los posibles archivos de código fuente para compilar no debería funcionar.

Si desea utilizar ndk-build, debe estudiar cuidadosamente el proyecto y comprender sus detalles e incorporarlos a su nuevo archivo Android.mk. Por ejemplo, si comprueba external directorio external en el repositorio de Android ( en github se enumeran como varios subproyectos ), puede ver muchos proyectos de código abierto y cómo se introducen en el sistema de compilación de Android.

Después de un largo y aburrido mensaje, lo que sugeriría es usar NDK como una cadena de herramientas independiente. Puede leer sobre este $NDK/docs/STANDALONE-TOOLCHAIN.html . En resumen, pude compilar STLXX como una biblioteca estática mediante el siguiente comando (mi ndk se instaló en ~ / bin)

NDK = ~ / bin / android-ndk-r8c PTHREAD_FLAG = COMPILADOR = "$ NDK / toolchains / arm-linux-androideabi-4.6 / prebuilt / linux-x86 / bin / arm-linux-androideabi-g ++ --sysroot = $ NDK / platforms / android-14 / arch-arm -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / include -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / include -L $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / -lgnustl_shared "make library_g ++

En el primer build falla con un problema en el archivo ./io/ufs_file_base.cpp . Hay algunos usos obsoletos de S_IREAD y S_IWRITE que no son compatibles con Android / Bionic. Ver informe de errores y referencia .

Debes actualizar la línea 88 como abajo

const int perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;

entonces

<same build command again>

ahora deberías obtener libstxxl.a bajo lib . No sé si esto realmente funciona o no, pero ya que esta era una pregunta de compilación, espero que responda o le dé algunas instrucciones.

Una última nota es sobre EABI de ARM. El comando anterior usa armeabi como se puede ver en los directorios especificados, es posible que desee utilizar armeabi-v7a si corresponde a su objetivo, ya que es más nuevo. A partir de sus mensajes de error, puedo ver que la compilación en particular estaba dirigida a xscale , si eso no es intencional, podría ser una buena idea familiarizarse con la arquitectura ARM / familias de productos.