2012-06-10 50 views
51

TL/DR: ¿Dónde puedo encontrar más información sobre la construcción de una cadena de herramientas de compilación cruzada GCC 4.7.0 para la plataforma ARM (gnueabi) (destinada a ejecutarse en un dispositivo Raspberry Pi)?Compilación cruzada para Raspberry Pi en GCC. ¿Donde empezar?

Acabo de recibir una nueva Raspberry Pi y estoy ansioso por comenzar a programarla. Logré instalar la herramienta GCC (estoy usando la imagen del sistema Arch Linux) y compilé algunos programas básicos, todo funciona bien.

También intenté compilar las bibliotecas de Boost porque a menudo las uso en mis proyectos y todo parecía funcionar bien siguiendo las instrucciones (./bootstrap.sh + ./b2) excepto por el hecho de que la compilación fue muy lenta. Lo dejé encendido por algunas horas pero apenas pasó los primeros pocos archivos fuente. Después de dejarlo funcionando durante la noche, descubrí que el proceso de compilación se había cancelado debido a la escasez de RAM.

Creo que Rasp Pi simplemente tiene poco poder para compilar algo de tamaño como Boost. Entonces, la compilación cruzada viene a mi mente. Sin embargo, a pesar de que hay mucha información sobre la compilación cruzada de ARM disponible en línea, la encuentro confusa. ¿Dónde incluso uno comienza?

Tengo una versión reciente de GCC (4.7.0) disponible en mi Raspberry Pi, por lo que me gustaría hacer una compilación cruzada con la misma versión. ¿Dónde puedo obtener la cadena de herramientas GCC 4.7.0 para ARM? (I compilaremos en x86 CentOS 6,2)

Editar:

que cancela la asignación de memoria de la GPU que no sean necesarios y crear una partición de intercambio de 4 GB en una unidad USB, mientras que construir archivos están en un recurso compartido de NFS. Boost ahora se está compilando mucho más rápido, por lo que es manejable. Sin embargo, me gustaría saber cómo puedo configurar un GCC 4.7 toolchain para compilación cruzada en mi PC x86, ya que tengo la intención de hacer mucha compilación y me gustaría que sea lo más rápido posible.

Edición 2:

Desde GCC 4.7.0 es relativamente nuevo, no parece haber un pre-construidos compilador cruzado (i386-> ARM). Probablemente tendré que construir uno yo mismo, lo que parece una tarea no trivial (lo he intentado y fallé). ¿Alguien sabe de un tutorial a seguir para construir un compilador cruzado de GCC, con suerte para una de las versiones recientes?

He intentado con this great shell script (que funcionó muy bien para compilar un compilador del mismo arco) y he creado binutils y los requisitos previos de GCC, pero la compilación de GCC siguió fallando con muchos errores crípticos. Estoy realmente perdido aquí, por lo que agradecería mucho su ayuda.

GCC en Frambuesa Pi se ha configurado con

--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

Datos 3:

logré construir una cadena de herramientas 4.7 GCC para ARM (yay!) Usando this shell script según lo sugerido por dwelch usuario en el comentarios También construí newlib y libstdc++ usando this article como guía. La herramienta funciona bien, pero cuando ejecuto el ejecutable en mi Raspberry Pi, falla con Illegal instruction. ¿Cuál podría ser la causa de eso?

+1

Pruebe el paquete zram si aún no está instalado. Esto creará un intercambio de RAM comprimido, que ayuda más de lo que piensas. (Extrañamente.) Agregue también un dispositivo USB decentemente rápido, ya sea un disco duro USD o un dispositivo USB de alta calidad, y cambie eso. –

+3

Además, en este hilo puede leer cómo deshabilitar la memoria de gráficos para que gane 32 megas de RAM: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410 –

+1

Wow, gracias . De hecho, tenía 128 MB asignados para GPU. No es de extrañar que todo fuera tan lento. – Tibor

Respuesta

2

No pude encontrar un 4.7 gcc, solo un 4.6. Para obtener más información, he recopilado núcleo del Pi en una máquina Ubuntu bastante antiguo (de 1 GHz, 768 MB de RAM) siguiendo las directrices de esta página: Kernel compilation

La construcción se llevó unos 90 minutos, en comparación con las 6 horas, se sugiere que se asumiría el Pi. El kernel funciona bien en el Pi. Tal vez pueda adaptar estas pautas para la compilación cruzada de otros proyectos en su máquina x86 Linux.

24

Encontré estas instrucciones How to build a cross compiler for your Raspberry Pi. Es un gran paso a través del uso de una herramienta crosstool-ng que simplifica la configuración de una compilación de compilación cruzada MUCHO (tiene una buena interfaz basada en curses) y es compatible con GCC 4.7.

Parece que funciona genial!

4

http://github.com/dwelch67/raspberrypibuildgcc directory hay un script para 4.7 gcc/gnu y 3.0 clang/llvm. gnu uno derivado del script en el proyecto mpx en opencores, corté gdb y libgcc, glibc, etc. lo bajé a un compilador. si quieres ese otro material, corta y pega el brazo para mips.

0

Como habrás notado, usar Raspberry Pi en sí mismo es lento, pero confiable (ya que no se trata de compilación cruzada), siempre que no te quedes sin memoria. Tal vez sea posible ajustar la memoria y cambiar la configuración para hacer posibles versiones más grandes (si no rápidas). Sé en los foros que la gente está hablando de colocar particiones raíz en SD, particiones de usuarios en unidades USB y, por supuesto, probablemente haga una diferencia obtener una tarjeta SD rápida (clase 6 o superior). Es posible, con el tiempo, que el rendimiento de la compilación mejore a medida que el software mejore. O, tal vez Raspberry Pi 2 tendrá un chipset mejorado y más RAM. :-)

+0

Gracias por la sugerencia, pero 30 minutos en RPi versus 1 minuto en mi computadora portátil hace que sea MUY poco práctico para el desarrollo donde tengo que reconstruir mucho. Si la diferencia no fuera tan drástica, definitivamente estaría desarrollando el dispositivo. – Tibor

+0

Sí, estoy en el mismo barco, aproximadamente 30 minutos de tiempo de construcción en el RPi. Voy a desarrollar en Linux (Ubuntu VM en Mac OS X, en realidad), y luego construiré en RPi cuando quiera probarlo. Espero que sea adecuado para mi propósito (es una configuración razonable) pero si no, estaré compilando también. – mlepage

+0

No sé si mi Pi es diferente, pero tengo uno de 2012. Está overclockeado a 1000MHz. Sin embargo, es capaz de compilar mi programa más grande ~ 10k líneas de código real (no comentarios, etc.). Tengo tiempos de compilación de alrededor de 30 segundos a 3 minutos dependiendo de si elimino todos los objetos de salida. Raramente obtengo la segfault de GCC. Sin embargo, es realmente una molestia depurar y cambiar el código sobre la marcha con ese tiempo de compilación. ¡Depuro todos mis programas en mi computadora portátil con Ubuntu y luego los compilo para el Pi! ¡Funciona perfectamente! – yash101

4

Aquí hay una guía paso a paso How to build Raspberry Pi cross-compiler in Windows. El motivo por el cual recibe el error Illegal Instruction es que Raspbian está habilitado para hardfp y requiere parches apropiados para que gcc y eglibc admitan hardfp. De lo contrario, el código generado utilizará diferentes ABI, es decir, pasará argumentos de función en diferentes registros, por lo que se bloqueará en el tiempo de ejecución.

También configurar erróneamente GCC para ARMv7 (Raspebby Pi es ARMv6) puede provocar Illegal Instruction error. Asegúrese de especificar la opción --with-arch=armv6 al configurar GCC.

La guía vinculada anteriormente se basa en GCC 4.6.3 embargo. Pero supongo que debería funcionar con GCC 4.7 también.

1

Usted podría intentar la cadena de herramientas en: https://github.com/kallaballa/Raspberry-GCC-4.7.3

Es un pre-construidos gcc-4.7.3 cadena de herramientas para ARMv6 con hardfp usando gnueabi. Lo estoy usando para cruzar compilar C++ 11 para un objetivo raspberrian.

Tenga en cuenta que solo funciona en hosts linux x86_64.

1

El dockcross project es un gran punto de partida para una cadena de herramientas completamente desodorizada, puede construir no solo para Pi sino para cualquier otra cosa. Estos son los comandos:

docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7 
chmod +x ./dockcross-linux-armv7 
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm' 

Se ha construido en cmake también.

Cuestiones relacionadas