2012-02-09 10 views
7

Vorrei compilare in modo incrociato le librerie statiche ICU per Android utilizzando Cygwin. Finora, sono stato in grado di configurare e realizzare le versioni Cygwin/MSVC e Cygwin. Ho installato android-ndk-r7 e posso vedere una versione di gcc nella directory toolchains. Diversi esempi suggeriscono l'uso dell'host: arm-eabi, ma questo non è presente sulla mia macchina.Compilazione ICU utilizzando arm-linux-androideabi-4.4.3

Ho copiato mh-linux-mh-sconosciuto in /ICU/source/config ed eseguire il seguente:

export HOST_ICU=/cygdrive/d/__/External/SQLite/icu 
export ICU_CROSS_BUILD=/cygdrive/d/__/External/SQLite/icu-cygwin 
export NDK_ROOT=/cygdrive/d/__/android-ndk-r7 
export CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib" 
export CXXFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib" 
export CFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib" 
export LDFLAGS="-lc -Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L $NDK_ROOT/platforms/android-8/arch-arm/usr/lib/" 

$HOST_ICU/source/configure --with-cross-build=$ICU_CROSS_BUILD --enable-extras=no --enable-strict=no --enable-static --enable-shared=no --enable-tests=no --enable-samples=no --enable-dyload=no --enable-tools=no --host=arm-eabi --with-data-packaging=archive 

ottengo il seguente errore:

checking for ICU version numbers... release 4.8.1.1, library 48.1.1, unicode version 6.0 
checking build system type... i686-pc-cygwin 
checking host system type... arm-unknown-eabi 
checking target system type... arm-unknown-eabi 
checking whether to build debug libraries... no 
checking whether to build release libraries... yes 
checking for arm-eabi-gcc... no 
checking for gcc... gcc 
checking whether the C compiler works... no 
configure: error: in `/cygdrive/d/Projects/__/External/SQLite/icu-android': 
configure: error: C compiler cannot create executables 
See `config.log' for more details 

Sono sicuro che questa è una domanda "stupida", ma come faccio a far sì che lo script di configurazione ICU faccia riferimento a gcc sotto $ NDK_ROOT \ toolchains \ arm-linux-androideabi-4.4.3 \ precompilati \ windows \ braccio-linux-androideabi \ bin? Mi manca qualche installazione o installazione? Dovrei impostare il mio PERCORSO in modo che il primo gcc trovato sia quello in arm-linux-androiedeabi?

Update 1. Ho appena notato che mentre windows \ arm-linux = androideabi \ bin contiene gcc, windows \ bin contiene braccio-linux-gcc-androideabi. Come faccio a chiamare l'ICU?

Update 2. Su suggerimento di Steven R. Loomis, ho preso gli aggiornamenti per config.sub e config.guess da

http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD

posto Android NDK-R7/toolchain/Supporto, linux-androideabi-4.4.3/precompilati/windows/bin nel mio percorso, e ri-ran configurano con --host = arm-linux-androideabi ... questa volta:

checking for arm-linux-androideabi-gcc... arm-linux-androideabi-gcc 
checking whether the C compiler works... no 

Decisamente più vicino. errore dettagliato da config.log

gcc version 4.4.3 (GCC) 
configure:3125: $? = 0 
configure:3114: arm-linux-androideabi-gcc -V >&5 
arm-linux-androideabi-gcc.exe: '-V' option must have argument 
configure:3125: $? = 1 
configure:3114: arm-linux-androideabi-gcc -qversion >&5 
arm-linux-androideabi-gcc.exe: unrecognized option '-qversion' 
arm-linux-androideabi-gcc.exe: no input files 
configure:3125: $? = 1 
configure:3145: checking whether the C compiler works 
configure:3167: arm-linux-androideabi-gcc -I/cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-arm/usr/include 
/-O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib -I/cygdrive/d/Projec 
ts/android-ndk-r7/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF1 
6_STRING=0 -fno-short-enums -nostdlib -lc -Wl,-rpath-link=/cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-a 
rm/usr/lib/ -L /cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-arm/usr/lib/ conftest.c >&5 
D:/Projects/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/ 
4.4.3/../../../../arm-linux-androideabi/bin/ld.exe: cannot find -lc 
collect2: ld returned 1 exit status 
configure:3171: $? = 1 
configure:3209: result: no 
configure: failed program was: 
| /* confdefs.h */ 
| #define PACKAGE_NAME "" 
| #define PACKAGE_TARNAME "" 
| #define PACKAGE_VERSION "" 
| #define PACKAGE_STRING "" 
| #define PACKAGE_BUGREPORT "" 
| #define PACKAGE_URL "" 
| /* end confdefs.h. */ 
| 
| int 
| main() 
| { 
| 
| ; 
| return 0; 
| } 
configure:3214: error: in `/cygdrive/d/Projects/__/External/SQLITE/icu-android': 
configure:3216: error: C compiler cannot create executables 
See `config.log' for more details 

Aggiornamento 3. Le modifiche al config.sub e config.guess lavorato in che ora stiamo usando il compilatore gcc destra. L'errore -lc deriva dal non essere in grado di trovare libc.so (che è in Android-ndk-r7/piattaforme/android-8/arch-arm/usr/lib "anche se questo è nell'LDFLAGS. spazio in più dopo -L nel LDFLAGS originale, ma la rimozione di questo non ha aiutato.

Aggiornamento 4. Secondo un posto più vecchio in http://groups.google.com/group/android-ndk/browse_thread/thread/46295616a889bc12

"The windows ndk toolchain is (thankfully) native to windows, so it doesnt go through the cygwin translation layer which would translate /cygdrive paths."

Aggiornamento 5. scambiati tutte le istanze di/cygdrive/d/con D: /. Ora il compilatore C funziona anche se non lo è ancora. Sospetta che ICU_CROSS_BUILD debba essere nella directory icu/source.

checking whether the C compiler works... yes 
checking for C compiler default output file name... a.out 
checking for suffix of executables... 
checking whether we are cross compiling... yes 
checking for suffix of object files... o 
checking whether we are using the GNU C compiler... yes 
checking whether arm-linux-androideabi-gcc accepts -g... yes 
checking for arm-linux-androideabi-gcc option to accept ISO C89... none needed 
checking for arm-linux-androideabi-g++... arm-linux-androideabi-g++ 
checking whether we are using the GNU C++ compiler... yes 
checking whether arm-linux-androideabi-g++ accepts -g... yes 
checking how to run the C preprocessor... arm-linux-androideabi-gcc -E 
checking for a BSD-compatible install... /usr/bin/install -c 
checking for gmake... /usr/bin/gmake 
configure: error: D:/Projects/__/External/SQLite/icu-cygwin/config/icucross.mk not found. Please build ICU in 
D:/Projects/__/External/SQLite/icu-cygwin first. 

Aggiornamento 6. Ho riconfigurato e ricostruito la mia cartella Cygwin in icu-cygwin. Vai a capire, questa volta icucross.mk era lì. Configurazione riuscita! Ma ...

Aggiornamento 7Fare il non è finito così bene.

$ make 
D:/Projects/__/External/SQLite/icu/source/config/mh-linux:41: *** target pattern contains no `%'. Stop. 

Cosa?!?! Sembra che ora vogliamo di nuovo percorsi Cygwin .. :(

Aggiornamento 8. cambiato la mia percorsi in modo che HOST_ICU e ICU_CROSS_BUILD utilizzare percorsi Cygwin, ma NDK_ROOT è percorso di Windows (dal NDK Android ld non è in grado di gestire i percorsi Cygwin).

questa volta più lontano ma

arm-linux-androideabi-gcc.exe: /cygdrive/d/Projects/__/External/SQLit                 e/icu/source/stubdata/stubdata.c: No such file or directory 
arm-linux-androideabi-gcc.exe: no input files 

sembra che ciò che deve accadere è che il braccio-linux-androideabi-gcc deve essere fatta per cygwin, o la croce-build non funzionerà.

Aggiornamento 9. Sembra che arm-linux-androideabi-gcc non supporti i percorsi cygwin, anche se ndk_build lo fa. Tuttavia, ICU è impostato per chiamare arm-linux-androideabi-gcc mentre "make" richiede percorsi cygwin. Forse il tempo di passare a OSX o Linux per farlo.

Aggiornamento 10 - Ancora nessun successo. Cygwin - Apparentemente anche il build arm-linux-androideabi Crystax non supporta i percorsi cygwin in -L. Tentare di eseguire una compilazione incrociata con Cygwin darà l'errore -lc, poiché non è in grado di analizzare il percorso -L/cygdrive/d/... della libreria. Passare a D:/aiuta, ma in seguito le cause fanno fallire poiché è Cygwin.

Linux - Utilizzando la normale build NDK r7, la configurazione fallirà con un errore wchar_t = 0. Il build NDK di Crystax risolverà questo problema e farà fallire lamentandosi di uint64_t in sys/type.h di Android. Vedi ICU library in Android NDK. È possibile forzarlo per essere definito e porterà a un altro errore relativo alla mancata corrispondenza delle dimensioni.

OSX - Probabilmente il più riuscito, compilando utilizzando la build ufficiale o la build Crystax, conduce direttamente al bug uint64_t. Se lo fai a pezzi, ti porterà a

icu/source/common/ustrenum.cpp:118: error: must #include <typeinfo> before using typeid 

Aiuto!

+0

sto prendendo un colpo qui. Ti manca una biblioteca. Sembra che il compilatore C non riesca a costruire per l'architettura di destinazione. script build obsoleti ecc. – Vangel

+0

@Vangel A questo punto è esattamente questo. arm-linux-androideabi-gcc sta cercando -lc (libc.so) che è in/cygdrive/d/Projects/android-ndk-r7/platform/android-8/arch-arm/lib/(che è specificato con -L) ma in qualche modo non riesco a trovarlo. Cercando di replicare al di fuori dello script, ma non sono sicuro di dove trovare conftest.c – tofutim

+0

Potrebbe essere che arm-linux-androideabi-gcc non può capire i percorsi cygwin? – tofutim

risposta

4

00. Scarica Android NDK http://developer.android.com/tools/sdk/ndk/index.html

esempio install d:\android-r9b

01. Scarica installare esempio d:\msys MSyshttp://www.mingw.org/wiki/MSYS 1,01

02. Scarica gcc 3.8.1 W64 http://mingw-w64.sourceforge.net/ esempio installare d:\mingw32_64

03. Scarica icu versin 52.1 http://site.icu-project.org/download/52#TOC-ICU4C-Download

04. estratto codice sorgente ICU per d:\icu

05. Enter msys uso export PATH=/d/msys/1.0/bin:/d/ming32_64/mingw32/bin:$PATH

06.cd /d/icu;mkdir mingw;mkdir android;cd mingw

questo è seguire ICU compilazione readme.html croce passi

07.cd /d/icu/ming ;../source/runConfigureICU MinGW ;make

nessun problema, tutto funziona e sotto /d/icu/mingw/bin generare strumenti per la compilazione incrociata più tardi.

08.cd /d/icu/android

09./d/android-ndk-r9b/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/d/androidgcc/ -- toolchain=arm-linux-androideabi-4.8

se la finestra uso 7/8 64bit aggiungere ulteriori opzioni: - system=windowx86_64

10. esportazione PATH di nuovo; export PATH=/d/msys/1.0/bin/:/d/androidgcc/bin/:/d/androidgcc/arm-linux-androideabi/bin/

il percorso deve includere l'esecuzione ar.exe per creare la libreria.

11. creare libreria condivisa.

sh ../source/configure --host=armv6-google-linux --enable-shared=yes --disable-static -with-cross-build=/d/icu/mingw CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ AR=arm-linux-androideabi-ar --with-data-packaging=archive 

12.make

tutto è successo

+0

comunque, se l'errore non riesce a trovare l'errore langinfo.h. è possibile scaricarlo da: http://ftp.cc.uoc.gr/mirrors/OpenBSD/src/include/ download langinfo.hand nl_types.h salvare in/d/ic/source/common –

+0

Poiché questo è il tuo prima risposta, si prega di osservare la mia modifica per vedere come rispondere correttamente. Benvenuti in SO e Happy Coding !!! –

+0

Questi passaggi sono stati molto utili. Ho dovuto aggiungere '' 'RANLIB = arm-linux-androideabi-ranlib''' al passo 11 per farlo compilare comunque con successo. – Bellinghammer

Problemi correlati