2012-11-15 10 views
9

Sto provando a compilare STXXL sotto Android NDK r8b (Ho lo stesso problema con il più recente r8c btw).Compilare STXXL sotto Android NDK r8b

Sto compilando utilizzando gnustl_static.

Ho bisogno C++ 11 supportano quindi inizialmente ho provato modificando

LOCAL_CPPFLAGS := -std=c++11 

ma questo vomitato un errore circa uint64_t.

così ho cambiato la bandiera a

LOCAL_CPPFLAGS :=-std=gnu++11 

Questo aiuta a un bel po ', ma quando inizia la compilazione ottengo un errore relativo alla STL GNU.

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 

Ho anche un intero carico più errori relativi a questo parametro _Arg.

Così guardando la prima funzione è simile al seguente:

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); 
    } 

non posso davvero capire dove il problema sta sorgendo. Gnu ++ 11 non sta definendo __GXX_EXPERIMENTAL_CXX0X__? O il problema è che non viene usato da qualche parte correttamente? Sono molto confuso su cosa sta causando il problema? Ho compilato STXXL con gnu ++ 11 sotto clang sull'iphone ma suppongo che iPhone stia probabilmente usando un'implementazione STL diversa. Qualcuno ha qualche idea su come posso risolvere questo problema?

Se avete bisogno di ulteriori informazioni basta chiedere!

Edit: Così seguito uno dei commenti qui è la mia application.mk

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

e questo è il mio 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) 

Edit: È interessante notare che ho appena provato a collocare uno #error temp all'interno dello #ifdef __GXX_EXPERIMENTAL_CXX0X__ b bloccare la funzione stl_tree.h che ho postato. Il compilatore NON lancia un errore su quella parte ... quindi la definizione non viene mai impostata, che è, presumibilmente, la causa dei miei problemi. Ho anche aggiunto uno specifico -D__GXX_EXPERIMENTAL_CXX0X__ ma questo non fa differenza (è come se non venisse risolto).

+0

Potrebbe essere che la tua versione di g ++ non sappia 'std = C++ 11'Hai provato' -std = C++ 0x'? – juanchopanza

+0

@juanchopanza: Ho provato gnu ++ 0x (come uint64_t non è definito in C++ 0x/11) e ottengo esattamente lo stesso problema. Si compila bene se ho impostato gnu ++ 03 ma poi ho perso il supporto per C++ 11 :( – Goz

+0

hai il 'Android.mk' e' Application.mk' per iniziare? –

risposta

4

Penso che il tuo approccio alla costruzione sia troppo ottimistico. Non so nulla di STXXL, ma qualsiasi progetto non banale ha molti dettagli nei propri file di creazione, quindi lanciando il proprio Android.mk e cercando di includere tutti i possibili file di codice sorgente da compilare non dovrebbe funzionare.

Se si desidera utilizzare ndk-build, è necessario studiare attentamente il progetto e comprenderne i dettagli e incorporarli nel nuovo file Android.mk. Ad esempio, se si controlla la directory external sotto repository Android (in github they are listed as several sub projects) è possibile vedere molti progetti open source e il modo in cui vengono introdotti nel sistema di generazione Android.

Dopo un messaggio lungo e noioso, ciò che suggerirei è di utilizzare NDK come una catena di strumenti autonoma. Puoi leggere questo $NDK/docs/STANDALONE-TOOLCHAIN.html.In breve sono stato in grado di compilare STLXX come una libreria statica tramite il seguente comando (il mio NDK è stato installato in ~/bin)

NDK = ~/bin/android-NDK-R8C PTHREAD_FLAG = COMPILATORE =" $ NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-g ++ --sysroot = $ NDK/piattaforme/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" fare library_g ++

A prima compilazione fallisce ingegno h un problema nel file ./io/ufs_file_base.cpp. Esistono alcuni usi obsoleti di S_IREAD e S_IWRITE che non sono supportati da Android/Bionic. Vedi bug report e reference.

è necessario aggiornare la linea 88, come di seguito

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

poi

<same build command again> 

ora si dovrebbe ottenere libstxxl.a sotto lib. Non so se questo è davvero funziona o no, ma dal momento che questa era una domanda di costruzione, spero che risponda o ti dia qualche indicazione.

Un'ultima nota riguarda ARM EABI. Il comando sopra utilizza armeabi come si può vedere nelle directory specificate, si potrebbe voler utilizzare armeabi-v7a se applicabile alla destinazione poiché è più recente. Dai tuoi messaggi di errore posso vedere che la build specifica era indirizzata allo xscale, se non fosse intenzionale potrebbe essere una buona idea farti familiarizzare con l'architettura ARM/le famiglie di prodotti.

+0

Lo stai costruendo come C++ 11? Perché non riesco a costruirlo senza problemi come C++ 03 usando i file .mk sopra. Il problema sta con C++ 11 da qualche parte ... comunque va benissimo iPhone con C++ 11 ... – Goz

+0

Posso aggiungere '-std = gnu ++ 11' alla C OMPILER = "..." e crea se è quello che stai chiedendo. Non sono riuscito a crearlo con i tuoi file .mk. – auselen

+0

OK interessante ... controllerò alcune cose. – Goz