¿Cómo instalar el compilador cruzado de Raspberry Pi en mi máquina host Linux?


Estoy intentando hacer una compilación cruzada para Raspberry Pi trabajando en mi máquina Ubuntu.

Durante mis intentos iniciales estaba usando el compilador arm-linux-gnueabi, que está disponible en el repositorio Ubuntu. Tengo esto funcionando. Pude construir todas mis dependencias y usar el compilador cruzado en mi proyecto cmake.

Sin embargo, creo que debería usar la versión hf, así que cambié a arm-linux-gnueabihf. Entonces me di cuenta de que esto no funciona con Raspberry Pi ya que es armv6.

Después de buscar en Google, encontré la cadena de herramientas pre-construida de GitHub.

He descargado la cadena de herramientas, pero realmente no entiendo cómo "instalarlo". Extraí los archivos a mi directorio personal. La estructura de directorios se ve así:

/gcc-linearo-arm-linux-gnueabihf-raspbian
    /arm-linux-gnueabihf
        /bin
            (contains g++, gcc, etc)
        /lib
            (contains libstdc++ library)
    /bin
        (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
    /lib
        (gcc lib stuff)

Si cambio el directorio a la carpeta bin INTERNA, puedo compilar un programa de prueba desde la terminal sin ningún problema.

~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test

Luego traté de compilar un programa de prueba en la carpeta bin EXTERIOR, que contiene las versiones prefijadas de las herramientas.

 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
 arm-linux-gnueabihf-g++ test.cpp -o test

Sin embargo, cuando intento usar el compilador ahora (desde fuera del directorio bin interno), no puede encontrar la biblioteca compartida libstdc++ que viene con la cadena de herramientas:

arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.

Además, quiero poder usar el compilador sin tener que navegar al directorio bin. Así que intenté agregar el directorio bin EXTERNO (ya que quiero las versiones prefijadas) y ambos directorios lib a mi RUTA:

export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib

Sin embargo, esto resulta en el mismo error. ¿Cómo debo "instalar" la cadena de herramientas para que pueda usar la cadena de herramientas desde todas partes, al igual que puedo cuando uso los compiladores cruzados del repositorio de Ubuntu?

Author: koverman47, 2013-10-03

7 answers

Voy a intentar escribir esto como un tutorial para que sea fácil de seguir.

Requisitos previos

Antes de comenzar, debe asegurarse de que esté instalado lo siguiente:

apt-get install git rsync cmake ia32-libs

¡Compilemos un Pastel!

Comience creando una carpeta en su directorio personal llamada raspberrypi.

Vaya a esta carpeta y tire hacia abajo de toda la carpeta de herramientas que mencionó anteriormente:

git clone git://github.com/raspberrypi/tools.git

Usted quería utilizar el siguiente de los 3, gcc-linaro-arm-linux-gnueabihf-raspbian, si lo hice no leer mal.

Entra en tu directorio personal y añade:

export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

Al final del archivo llamado ~/.bashrc

Ahora puede cerrar sesión y volver a iniciar sesión (es decir, reiniciar su sesión de terminal), o ejecutar . ~/.bashrc en su terminal para recoger la adición PATH en su sesión de terminal actual.

Ahora, verifique que puede acceder al compilador arm-linux-gnueabihf-gcc -v. Usted debe conseguir algo como esto:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/tudhalyas/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.b
 uild/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-
 linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-l
 inux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/
 arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fo
 rtran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=
 hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=
 https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgom
 p --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-rasp
 bian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-
 ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc
 =/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-
 gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf
 -raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/cros
 stool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --wi
 th-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/a
 rm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/bui
 lds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --ena
 ble-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gol
 d --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-li
 nux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08
 )

Pero hey! Yo hice eso y las libs todavía no ¡Trabaja!

¡Aún no hemos terminado! Hasta ahora, solo hemos hecho lo básico.

En tu carpeta raspberrypi, crea una carpeta llamada rootfs.

Ahora necesita copiar todo el directorio /lib y /usr a esta carpeta recién creada. Normalmente subo la imagen rpi y la copio a través de rsync:

rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs

Donde 192.168.1.PI se sustituye por la IP de su Raspberry Pi.

Ahora, necesitamos escribir un archivo de configuración cmake. Abra ~/home/raspberrypi/pi.cmake en su editor favorito e inserte el siguiente:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspberrypi/rootfs)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Ahora debería ser capaz de compilar sus programas cmake simplemente agregando esta bandera adicional: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake.

Usando un cmake hello world ejemplo:

git clone https://github.com/jameskbride/cmake-hello-world.git 
cd cmake-hello-world
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../
make
scp CMakeHelloWorld [email protected]:/home/pi/
ssh [email protected] ./CMakeHelloWorld
 194
Author: Stenyg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 21:10:42

No pude conseguir que el compilador (x64 version) usara el sysroot hasta que agregué SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs) a pi.cmake.

 5
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 13:13:21

Para Windows host, quiero recomendar encarecidamente este tutorial::

  • Descargue e instale la cadena de herramientas
  • Sincroniza sysroot con tus directorios RPI include/lib
  • Compila tu código
  • Arrastra y suelta el ejecutable a tu RPi usando SmarTTY
  • ejecutarlo!

Nada más, nada menos!

Cadenas de herramientas GNU prediseñadas disponibles para Raspberry, Beaglebone, Cubieboard, AVR (Atmel) y más

 4
Author: SBF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-24 07:16:28

No pude compilar QT5 con ninguna de las (bastante anticuadas) cadenas de herramientas de git://github.com/raspberrypi/tools.git. El script configure seguía fallando con un error de "no se pudo determinar la arquitectura" y con problemas masivos de ruta para los directorios include. Lo que funcionó para mí fue usar la cadena de herramientas Linaro

Http://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/runtime-linaro-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz

En combinación con

Https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

No corregir los enlaces simbólicos del sysroot conduce a errores de símbolos indefinidos como se describe aquí: Un error al construir bibliotecas Qt para raspberry pi Este me sucedió cuando probé el script fixQualifiedLibraryPaths de tools.git. Todo lo demás se describe en detalle en http://wiki.qt.io/RaspberryPi2EGLFS . Mis ajustes de configuración fueron:

./ configure-opengl es2-device linux-rpi3-g++-device-option CROSS_COMPILE=/usr/local/rasp/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf - - sysroot / usr / local / rasp / sysroot-opensource-confirm-license-optimized-qmake-reduce-exports-release-make libs - prefix/usr/local /qt5pi-hostprefix/usr/local / qt5pi

Con /usr/local/rasp/sysroot siendo la ruta de mi copia del sistema Raspberry Pi 3 Raspbian (Jessie) local y /usr/local/qt5pi siendo la ruta del QT compilado cruzado que también tiene que ser copiado al dispositivo. Tenga en cuenta que Jessie viene con GCC 4.9.2 cuando elija su cadena de herramientas.

 2
Author: cuffel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:53

La pregunta inicial se ha publicado hace bastante tiempo y mientras tanto Debian ha hecho grandes avances en el área de soporte multiarch.

Multiarch es un gran logro para la compilación cruzada!

En pocas palabras, se requieren los siguientes pasos para aprovechar multiarch para Raspbian Jessie cross compilation:

  • En su host Ubuntu instale Debian Jessie amd64 dentro de un contenedor chroot o LXC.
  • Habilitar la arquitectura extranjera armhf.
  • Instale el compilador cruzado desde el repositorio emdebian tools.
  • Modifica el compilador cruzado (generaría código para ARMv7-A por defecto) escribiendo un archivo de especificaciones gcc personalizado.
  • Instalar bibliotecas armhf (libstdc++, etc.) del repositorio Raspbian.
  • Construye tu código fuente.

Dado que esto es mucho trabajo, he automatizado la configuración anterior. Puedes leer sobre esto aquí:

Compilación Cruzada para Raspbian

 2
Author: Matthias Lüscher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 18:47:03

Hay un CDP Studio IDE disponible que hace que la compilación cruzada y el despliegue sean bastante simples tanto desde windows como desde linux y solo puede marcar la casilla de verificación raspberry toolchain durante la instalación. (PS. tiene soporte GPIO e I2C, por lo que no se necesita código para acceder a ellos)

La demostración IDE del uso de raspberry está aquí: https://youtu.be/4SVZ68sQz5U

Y puedes descargar el IDE aquí: https://cdpstudio.com/home-edition

 0
Author: Jüri T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 12:33:09

He creado el Último Conjunto de Compiladores Cruzados/Binarios Nativos de Raspberry Pi GCC Precompilados (Método más Fácil):

Compiladores cruzados de Raspberry Pi GCC / Binarios nativos (v8.2.0)

Disfrute de Compiladores cruzados de Raspberry pi GCC Precompilados sin Complicaciones y ahorre su valioso tiempo. No se necesita ningún tipo de compilación o Manejo de Errores. Solo Extraer, Enlazar & Disfrute de la funcionalidad completa de GCC (Raspberry Pi) en su máquina.

 0
Author: AbhiTronix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 02:39:36