2012-02-09 12 views
7

Me gustaría compilar de forma cruzada libs estáticas para Android usando Cygwin. Hasta ahora, he podido configurar y hacer las versiones de Cygwin/MSVC y Cygwin. He instalado el android-ndk-r7 y puedo ver una versión de gcc en el directorio toolchains. Varios ejemplos sugieren usar host: arm-eabi, pero esto no está presente en mi máquina.Compilando la unidad de cuidados intensivos usando arm-linux-androideabi-4.4.3

he copiado mh-Linux a mh-desconocido en /UCI/fuente/config y ejecute el siguiente:

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 

me sale el siguiente error:

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 

Estoy seguro de que esta es una pregunta "estúpida", pero ¿cómo hago para que el guión de configuración de ICU apunte al gcc en $ NDK_ROOT \ toolchains \ arm-linux-androideabi-4.4.3 \ preconstruido \ windows \ arm-linux-androideabi \ bin? ¿Me falta alguna configuración o instalación? ¿Debo configurar mi ruta para que el primer gcc encontrado sea el de arm-linux-androiedeabi?

actualización 1. Acabo de notar que mientras windows \ arm-linux = androideabi \ bin contiene gcc, windows \ bin contiene brazo-linux-gcc-androideabi. ¿Cómo consigo que ICU llame a esto?

Actualización 2. Por sugerencia de Steven R. Loomis, cogí versiones de config.sub y config.guess 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

colocaron android-NDK-R7/cadenas de herramientas/brazo- Linux-androideabi-4.4.3/prebuilt/ventanas/bin en mi camino, y re-ran configuran con --host = arm-linux-androideabi ... esta vez:

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

Definitivamente más cerca. error detallado de 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 

actualización 3. Los cambios a config.sub y config.guess trabajaron en la que ahora estamos usando el compilador gcc derecha. La falla de -lc viene de no poder encontrar libc.so (que está en android-ndk-r7/platforms/android-8/arch-arm/usr/lib "aunque esto está en los LDFLAGS. Tenía un espacio adicional después -L en el LDFLAGS original, pero retirar esta no ayudaron.

actualización 4. de acuerdo con un puesto de más edad en 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."

actualización 5. intercambiado todas las instancias de/cygdrive/d/with D: /. Ahora el compilador C funciona aunque todavía no lo hace. Sospeche que ICU_CROSS_BUILD tiene que estar en el directorio 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. 

Actualización 6. He reconfigurado y reconstruido mi carpeta Cygwin en icu-cygwin. Ve figura, esta vez icucross.mk estaba allí. ¡Configuración exitosa! Pero ...

Actualización 7Hacer no terminó tan bien.

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

¿Qué?!?! Parece que ahora queremos caminos Cygwin nuevo .. :(

actualización 8. cambiado mi caminos para que HOST_ICU y ICU_CROSS_BUILD utilizan rutas de Cygwin, pero es NDK_ROOT ruta de Windows (desde Android NDK ld no puede manejar caminos cygwin).

esta vez más lejos pero

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 

parece que lo que tiene que ocurrir es que el brazo-linux-androideabi-gcc necesita ser hecho para cygwin, o la cruz-build no funcionará.

Actualización 9. Parece que arm-linux-androideabi-gcc no es compatible con las rutas cygwin, aunque ndk_build sí. Sin embargo, ICU está configurado para llamar a arm-linux-androideabi-gcc, mientras que "make" requiere rutas cygwin. Tal vez sea hora de cambiar a OSX o Linux para hacer esto.

Actualización 10 - Aún no ha tenido éxito. Cygwin - Al parecer, la compilación Crystax de arm-linux-androideabi tampoco es compatible con las rutas cygwin en -L. Intentar realizar una compilación cruzada en Cygwin dará el error -lc, ya que no puede analizar la ruta -L/cygdrive/d/... a la biblioteca. Cambiando a D:/ayuda, pero luego causa que falle ya que es Cygwin make.

Linux - Usando la compilación NDK r7 normal, la configuración fallará con un error wchar_t = 0. La compilación Crystax NDK arreglará esto, y make fallará quejándose de uint64_t en sys/type.h de Android. Ver ICU library in Android NDK. Puede forzar que se defina y dará lugar a otro error más sobre el desajuste de tamaño.

OSX - Probablemente el más exitoso, compilando usando la compilación oficial o la compilación de Crystax, conduce directamente al error uint64_t. Si lo piratea, lo llevará a

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

¡Ayuda!

+0

estoy tomando un golpe aquí. Te estás perdiendo una biblioteca. Parece que tu compilador de C no puede construir para la arquitectura de destino. script de compilación obsoleto, etc. – Vangel

+0

@Vangel En este punto es exactamente eso. arm-linux-androideabi-gcc está buscando -lc (libc.so) que está en/cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-arm/lib/(que se especifica con -L) pero de alguna manera no puede encontrarlo. Intentando replicar fuera de la secuencia de comandos, pero no estoy seguro de dónde encontrar conftest.c – tofutim

+0

¿Podría ser que arm-linux-androideabi-gcc no puede entender las rutas de cygwin? – tofutim

Respuesta

4

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

ejemplo install d:\android-r9b

01. Descargar ejemplo de instalación d:\msys MSyshttp://www.mingw.org/wiki/MSYS 1,01

02. Descargar gcc 3.8.1 w64 http://mingw-w64.sourceforge.net/ ejemplo instalar d:\mingw32_64

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

04. Extracto de código fuente UCI a d:\icu

05. Introduzca 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

esto es seguir UCI compilador cruzado readme.html Pasos

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

ningún problema, todo está funcionando y bajo /d/icu/mingw/bin generar herramientas para compilar cruzada posterior.

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 la ventana uso 7/8 de 64 bits añadir opciones adicionales: - system=windowx86_64

10. exportación PATH otra vez; export PATH=/d/msys/1.0/bin/:/d/androidgcc/bin/:/d/androidgcc/arm-linux-androideabi/bin/

la ruta debe incluir el ar.exe ejecutar para crear la biblioteca.

11. crear biblioteca compartida.

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

todo es éxito

+0

de todos modos, si tiene un error, no puede encontrar el error langinfo.h. puede descargarlo desde: http://ftp.cc.uoc.gr/mirrors/OpenBSD/src/include/ descargar langinfo.hand nl_types.h guardar en/d/ic/source/common –

+0

Dado que este es su primera respuesta, por favor, observe mi edición para ver cómo responder correctamente. Bienvenido a SO y Happy Coding !!! –

+0

Estos pasos fueron muy útiles. Tuve que agregar '' 'RANLIB = arm-linux-androideabi-ranlib''' al paso 11 para que se construyera correctamente sin embargo. – Bellinghammer