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!
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
@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
Potrebbe essere che arm-linux-androideabi-gcc non può capire i percorsi cygwin? – tofutim