c++ linux arm cross-compiling raspberry-pi

c++ - Instalación del compilador cruzado Raspberry Pi



linux arm (6)

Estoy intentando obtener una compilación cruzada de 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 de 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 precompilada de GitHub: https://github.com/raspberrypi/tools .

Descargué la cadena de herramientas, pero realmente no entiendo cómo "instalarla". Extraje los archivos a mi directorio personal. La estructura del directorio 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 INNER, puedo compilar un programa de prueba desde el terminal sin ningún problema.

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

Luego intenté 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 utilizar el compilador ahora (desde fuera del directorio bin interno), no puedo 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 traté de agregar el directorio OUTER bin (ya que quiero las versiones prefijadas) y ambos directorios lib a mi PATH:

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

Sin embargo, esto produce el mismo error. ¿Cómo debería "instalar" la cadena de herramientas para que pueda usar la cadena de herramientas desde cualquier lugar, al igual que cuando uso los compiladores cruzados del repositorio de Ubuntu?


Dado que la pregunta no menciona el sistema operativo, quiero recomendar encarecidamente este tutorial: crear aplicaciones Raspberry PI desde Windows

  • Descargar e instalar la cadena de herramientas
  • Sincroniza sysroot con tus directorios RPi include / lib
  • Compila tu código
  • Arrastra y suelta el ejecutable en tu RPi usando SmarTTY
  • ¡Ejecutarlo!

¡Nada más y nada menos!

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


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 la compilación cruzada Raspbian Jessie:

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

Como esto es mucho trabajo, he automatizado la configuración anterior. Puede leer sobre esto aquí: http://www.get-edi.io/Cross-Compiling-for-Raspbian/


No pude compilar QT5 con ninguno de los toolchains (bastante desactualizados) de git: //github.com/raspberrypi/tools.git. La secuencia de comandos de configuración siguió fallando con un error de "no se pudo determinar la arquitectura" y con problemas de ruta masiva para incluir directorios. 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

Si no se corrigen los enlaces simbólicos de sysroot, se generan errores de símbolos indefinidos, como se describe aquí: Un error al compilar bibliotecas Qt para el raspberry pi. Esto me sucedió cuando probé el script fixQualifiedLibraryPaths desde tools.git. Everthing else se describe en detalle en http://wiki.qt.io/RaspberryPi2EGLFS . Mis configuraciones 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 Raspbian Pi 3 Raspbian (Jessie) local y / usr / local / qt5pi la ruta del QT cruzado que también debe copiarse en el dispositivo. Tenga en cuenta que Jessie viene con GCC 4.9.2 cuando elige su cadena de herramientas.


No pude obtener el compilador (versión x64 ) para usar el sysroot hasta que agregué SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs) a pi.cmake .


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

Pre requisitos

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

apt-get install git rsync cmake ia32-libs

¡Crucemos compilamos un pastel!

Comience con hacer una carpeta en su directorio de inicio llamado raspberrypi .

Vaya a esta carpeta y despliegue la carpeta de herramientas ENTERA que mencionó anteriormente:

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

Querías usar el siguiente de los 3, gcc-linaro-arm-linux-gnueabihf-raspbian , si no lo leí mal.

Vaya a su directorio personal y agregue:

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 . ~/.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 . Deberías obtener 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! ¡Lo hice y las libs todavía no funcionan!

¡No hemos terminado todavía! Hasta ahora, solo hemos hecho lo básico.

En su carpeta raspberrypi , rootfs una carpeta llamada rootfs .

Ahora necesita copiar todo el directorio /lib y /usr a esta carpeta recién creada. Normalmente traigo 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 es reemplazado por el IP de su Raspberry Pi.

Ahora, necesitamos escribir un archivo de configuración de cmake . Abra ~/home/raspberrypi/pi.cmake en su editor favorito e inserte lo 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 poder compilar sus programas de cmake simplemente agregando esta bandera adicional: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake .

Usando un ejemplo de cmake hello world :

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


hay un IDE de CDP Studio que hace que la compilación cruzada y la implementación sean bastante simples tanto desde Windows como desde Linux, y solo puede marcar la casilla de la cadena de herramientas frambuesa durante la instalación. (PD. Tiene soporte GPIO e I2C por lo que no se necesita código para acceder a ellos)

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

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