7 votes

Compilation de ICU avec arm-linux-androideabi-4.4.3

Je voudrais faire une compilation croisée des librairies statiques ICU pour Android en utilisant Cygwin. Jusqu'à présent, j'ai pu configurer et réaliser les versions Cygwin/MSVC et Cygwin. J'ai installé la version Android-ndk-r7 et je vois une version de gcc dans le répertoire toolchains. Plusieurs exemples suggèrent d'utiliser host:arm-eabi - mais ce n'est pas présent sur ma machine.

J'ai copié mh-linux a mh-inconnu en /icu/source/config et exécutez ce qui suit :

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

Je reçois l'erreur suivante :

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

Je suis sûr que c'est une question "stupide", mais comment faire pour que la configuration ICU script pointe vers le gcc sous $NDK_ROOT. \toolchains\arm -linux-androideabi-4.4.3 \prebuilt\windows\arm -linux-androideabi \bin ? Est-ce que j'ai manqué une installation ou un setup ? Devrais-je configurer mon PATH de façon à ce que le premier fichier gcc trouvé est celui de arm-linux-androiedeabi ?

Mise à jour 1. Je viens de remarquer que pendant que Windows \arm -linux=androideabi \bin contient gcc , Windows \bin contient arm-linux-androideabi-gcc . Comment je fais pour que les soins intensifs appellent ça ?

Mise à jour 2. Sur la suggestion de Steven R. Loomis, j'ai récupéré les mises à jour de config.sub et config.guess à partir de

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

placé Android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/Windows/bin dans mon chemin, et j'ai relancé configure avec --host=arm-linux-androideabi... cette fois :

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

Définitivement plus proche. Erreur détaillée du fichier 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

Mise à jour 3. Les modifications apportées à config.sub et config.guess ont fonctionné dans la mesure où nous utilisons maintenant le bon compilateur gcc. L'échec de -lc vient du fait qu'il n'est pas possible de trouver libc.so (qui est dans Android-ndk-r7/platforms/Android-8/arch-arm/usr/lib" bien qu'il soit dans les LDFLAGS. J'avais un espace supplémentaire après -L dans les LDFLAGS d'origine, mais le supprimer n'a pas aidé.

Mise à jour 4. D'après un ancien post dans http://groups.google.com/group/Android-ndk/browse_thread/thread/46295616a889bc12

"La chaîne d'outils ndk de Windows est (heureusement) native de Windows, donc elle ne passe pas par la traduction de cygwin. donc elle ne passe pas par la couche de traduction de Cygwin qui traduirait les chemins /cygdrive".

Mise à jour 5. J'ai échangé toutes les instances de /cygdrive/d/ avec D:/. Maintenant, le compilateur C fonctionne mais il ne fait toujours pas. Je soupçonne que ICU_CROSS_BUILD doit être dans le répertoire 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.

Mise à jour 6. J'ai re-configuré et rbâti mon dossier Cygwin dans icu-cygwin. Allez savoir pourquoi, cette fois icucross.mk était là. Configuration réussie ! Mais...

Mise à jour 7 Faire ne s'est pas si bien terminée.

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

Quoi ? !?! Il semble que maintenant nous voulons à nouveau des chemins Cygwin :(

Mise à jour 8. J'ai modifié mes chemins de sorte que HOST_ICU et ICU_CROSS_BUILD utilisent des chemins Cygwin, mais NDK_ROOT est un chemin Windows (puisque Android NDK ld ne peut pas gérer les chemins Cygwin).

Cette fois-ci, plus loin mais

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

Il semble que ce qui doit se passer est que arm-linux-androideabi-gcc doit être fait pour cygwin, ou le cross-build ne fonctionnera pas.

Mise à jour 9. Il semble que arm-linux-androideabi-gcc ne supporte pas les chemins cygwin - alors que ndk_build le fait. Cependant, ICU est configuré pour appeler arm-linux-androideabi-gcc alors que "make" requiert des chemins cygwin. Il est peut-être temps de passer à OSX ou Linux pour faire cela.

Mise à jour 10 - Toujours pas de succès. Cygwin - Apparemment, la version Crystax de arm-linux-androideabi ne supporte pas non plus les chemins cygwin dans -L. Tenter de faire une compilation croisée sous Cygwin donnera l'erreur -lc, puisqu'il ne peut pas analyser le chemin -L/cygdrive/d/... vers la bibliothèque. Changer pour D:/ aide, mais fait échouer make puisqu'il s'agit de make Cygwin.

Linux - En utilisant la version normale du NDK r7, la configuration échouera avec une erreur wchar_t = 0. La version Crystax NDK corrige ce problème, et make ne se plaindra pas de l'erreur uint64_t dans sys/type.h d'Android. Bibliothèque ICU dans Android NDK . Vous pouvez le forcer à être défini et cela conduira à une autre erreur de non concordance de taille.

OSX - Probablement la plus réussie, la compilation en utilisant le build officiel ou le build Crystax, elle mène directement au bug uint64_t. Si vous le contournez, cela vous mènera à

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

Au secours !

4voto

William Wang Points 41

00. Télécharger Android ndk http://developer.Android.com/tools/sdk/ndk/index.html

exemple install d:\android-r9b

01. Télécharger l'exemple d'installation d:\msys MSys http://www.mingw.org/wiki/MSYS 1.01

02. Télécharger gcc 3.8.1 w64 http://mingw-w64.sourceforge.net/ exemple d'installation d:\mingw32_64

03. Télécharger icu versin 52.1 http://site.icu-project.org/download/52#TOC-ICU4C-Download

04. Extraire le code source d'icu pour d:\icu

05. Entrez msys utiliser export PATH=/d/msys/1.0/bin:/d/ming32_64/mingw32/bin:$PATH

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

c'est suivre les étapes de compilation croisée d'icu readme.html

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

pas de problème, tout fonctionne et sous /d/icu/mingw/bin générer des outils pour la compilation croisée plus tard.

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

Si vous utilisez Windows 7/8 64bit, ajoutez des options supplémentaires : -- system=windowx86_64

10. exporter PATH encore ; export PATH=/d/msys/1.0/bin/:/d/androidgcc/bin/:/d/androidgcc/arm-linux-androideabi/bin/

le chemin doit inclure le ar.exe Exécuter pour créer une bibliothèque.

11. créer une bibliothèque partagée.

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

tout est réussi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X