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
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