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!
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
@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
¿Podría ser que arm-linux-androideabi-gcc no puede entender las rutas de cygwin? – tofutim