2012-08-16 21 views
42

Intenté construir i686-linux-android-gfortran usando build-gcc.sh siguiendo this (es para androdindk-7b) pero me sale un error sobre link.h. Agregué link.h desde here, pero proporciona más errores.¿Cómo construir i686-linux-android-gfortran para android-ndk8b (x86 arco Android)?

Alguien ha probado que permite i686-linux-android-gfortran para x86 Android?

+10

Kudos para dirigir un sistema operativo móvil con dispositivos Fortran :) –

+0

¿Ha tenido éxito en Edificio ng solo la parte del compilador c de gcc funciona antes de probar gfortran? – DaveP

+0

Android-ndk8b viene con el compilador c (i686-linux-android-gcc, i686-linux-android-g ++ ..) pero carece de i686-linux-android-gfortran. Gracias por la respuesta Dave – solti

Respuesta

1

De https://groups.google.com/forum/#!msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ como se sugiere selalerer. No probé esto, así que estoy publicando como una wiki de la comunidad para fines de referencia.

Fortran para x86 Android =================

La guía se basa en este caso, muchas gracias a Phil: Compiling Android NDK with Objective-C-enabled gcc errors

1) Descargar y descomprimir Android NDK 'android-NDK-R8C', (el NDK mayores -r8b no funcionará debido a la falta link.h): wget http://dl.google.com/android/ndk/android-ndk-r8c-linux-x86.tar.bz2

2) Crear un lugar de una carpeta llamada 'toolchain- src '(por ejemplo, dentro de la carpeta android-ndk-r8c), ' cd 'a este nuevo fo lder

3) Asegúrese de tener instalado Git ('yum install git' o lo que sea ..) y descargar las fuentes de las herramientas principales:

git clone https://android.googlesource.com/toolchain/build.git 
    git clone https://android.googlesource.com/toolchain/gmp.git 
    git clone https://android.googlesource.com/toolchain/gdb.git 
    git clone https://android.googlesource.com/toolchain/mpc.git 
    git clone https://android.googlesource.com/toolchain/mpfr.git 
    git clone https://android.googlesource.com/toolchain/expat.git 

4) Crear la carpeta 'binutils', 'cd' a este directorio, desempaquetar binutils-2.23 allí: wget ftp.gnu.org/gnu/binutils/binutils-2.23.tar.gz tar -xvzf binutils-2.23.tar.gz Ahora debería tener una carpeta toolchain- src/binutils/binutils-2,23

5) Cambio de carpeta cadena de herramientas-src/Construcción, edite el Makefile.in, cambiando la línea: with-gnu-with-como GNU-ld --enable-languages ​​= c, C++ a with-gnu-como --con -gnu-ld --enable-languages ​​= C, C++, Fortran

6) En el archivo android-NDK-R8C/construcción/herramientas/build-mingw64-toolchain.sh cambiar la línea: GCC_CONFIGURE_OPTIONS var_append "- -enable-languages ​​= C, C++" a GCC_CONFIGURE_OPTIONS var_append "--enable-languages ​​= C, C++, Fortran"

7) en el archivo android-NDK-R8C/construcción/herramientas/build-gcc. sh, cambie la línea: EXTRA_CONFIG_FLAGS = $ EXTRA_CONFIG_FLAGS" --disable-libquadmath --dis poder-plugin " a EXTRA_CONFIG_FLAGS = $ EXTRA_CONFIG_FLAGS" --disable-libquadmath-libquadmath-apoyo --disable --disable-plugin"

8) En el archivo android-NDK-R8C/construcción/herramientas/construcción -host-gcc.sh, cambie la línea: ARGS = $ args "--enable-languages ​​= c, C++" a ARGS = $ args "--enable-languages ​​= C, C++, Fortran" y cambiar la línea ARGS = $ ARGS "--disable-libquadmath --disable-plugin --disable-libitm --disable-bootstrap" a ARGS = $ ARGS "--disable-libquadmath --disable-libquadmath-support --disable-plugin - -disable-libitm --disable-bootstrap "

9) Construya su nueva cadena de herramientas: /your/path/to/android-ndk-r8c/build/tools/build-gcc.sh -j1 --gmp- version = 5.0.5 --mpfr-version = 2.4.2 --mpc-version = 0.8.1 --binutils-version = 2.23 --gdb-version = 7.3.x/su/ruta/a/toolchain-src/su/ruta/a/android-ndk-r8c x86-4.7 (no se preocupe por mensajes como 'expr: advertencia: no portables BRE:')

10) e ir hasta las rodillas delante de la pantalla, orando al Señor que de alguna manera estas innumerables scripts de configuración haciendo comprobaciones que nadie necesita, utilizando un lenguaje de shell feo que cocina tu cerebro con sangría yendo de derecha a izquierda, de alguna manera logrará compilar un trillón de archivos demasiado pequeños (de modo que el 10% del tiempo se gasta en compilación y 90 % al iniciar GCC), y después de una hora de ver el progreso con tail -F /tmp/ndk-YourUserName/build/toolchain/config.log su cadena de herramientas estará mágicamente lista. Lo encontrará en la carpeta android-ndk-r8c/toolchains.

11) Por último, 'cd' a la carpeta '/your/path/to/android-ndk-r8c/toolchains/x86-4.7/prebuilt/linux-x86/i686-linux-android' y correr este comando: ln -s ../libexec libexec Sin este comando, puede ocurrir que g ++ genere el mensaje de error "g ++: error fatal: -fuse-linker-plugin, pero liblto_plugin.so no encontrado". Usando strace, encontré que g ++ busca en la carpeta incorrecta, pero el enlace de arriba le permite encontrar el archivo liblto_plugin.so, sin embargo.

Y aquí están algunas lecciones aprendidas en el camino, por lo que Google encuentra en:

*) Para acelerar la compilación, se puede quitar el '-j1'. Pero solo después de que obtuvo para que funcione una vez, dado que construir en paralelo en múltiples núcleos de CPU fue reportado a causar problemas adicionales.

*) El mensaje de error "Las pruebas de enlace no están permitidas después de que GCC_NO_EXECUTABLES" aparezca cuando el enlace falla para x86 (funciona para ARM). La razón es que GCC no incluye ANDROID_STARTFILE_SPEC y ANDROID_ENDFILE_SPEC de gcc-4.6.1/gcc/config/linux-android.h. GCC 4.6.1 solo los especifica para ARM, pero no para para i386, GCC 4.8.0 sí lo hace. Los GCC descargados de Google también lo hacen, , así que es mejor usar el GCC de Google.

*) El mensaje de error "Error fatal: link.h: No existe el fichero o directorio" también sucede con GCC de Google, y al parecer (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50877) solamente cuando se habilita idiomas adicionales como objc o FORTRAN. El hilo bug es aquí: http://gcc.gnu.org/ml/gcc-bugs/2012-08/msg00494.html MIPS tiene link.h en android-NDK-R8b/plataformas/android-9/arch-MIPS/usr/incluir En android-NDK-R8C, link.h es ahora también presente en android-9/arch-x86/usr/include/link.h, por lo que se solucionó este error.

*) El mensaje de error "error fatal: quadmath_weak.h: No existe ese archivo o directorio": También ocurre con el último gcc-4.8, por lo que podemos seguir utilizando Google GCC 4.7. Google mismo usa --disable-libquadmath, pero también necesitamos --disable-libquadmathsupport (vea http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47648). Por lo que este necesita ser añadido en android-NDK-R8C/construcción/herramientas/build-gcc.sh y android-NDK-R8C/construcción/herramientas/build-host-gcc.sh

*) La mensaje de error "error: Pthreads son necesarios para compilar libatomic" Ocurre al compilar la versión ARM de gcc-4.8 descargado de gnu.org, mejor quedarse con los GCC de Google.

*) El CCG que viene con Android-NDK-R8C no funcionaba para mí (mensaje de error sobre libstdC++. So.6 ser demasiado viejo), mientras que el de android-NDK-R8b trabajó sin problemas . Dado que android-ndk debería admitir tantos entornos como como sea posible, no estoy seguro de por qué los Googlers decidieron depender de una libstdC++ más reciente, , pero la buena noticia es que la construcción de su propia cadena de herramientas resuelve el problema.

*) Si se produce un error durante la compilación genérica-morestack.c, luego vuelva a colocar #ifdef Linux // En Linux, las dos primeras señales en tiempo real son utilizados por el NTPL con #if defined (GLIBC) & & definido (Linux) // en Linux, las dos primeras señales en tiempo real son utilizados por los NPTL