Estoy intentando obtener una compilación cruzada para Raspberry Pi que funcione en mi máquina Ubuntu.
Durante mis intentos iniciales, estaba usando el compilador arm-linux-gnueabi, que está disponible en el repositorio de Ubuntu. Conseguí que esto funcione. 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 prediseñada de GitHub .
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 de directorio a la carpeta INNER bin, 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 OUTER, 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 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 hasta el directorio bin. Así que intenté agregar el directorio bin OUTER (ya que quiero las versiones con prefijo) 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 da como resultado el mismo error. ¿Cómo debo "instalar" la cadena de herramientas para poder usar la cadena de herramientas desde cualquier lugar, al igual que puedo cuando uso los compiladores cruzados del repositorio de Ubuntu?
fuente
Respuestas:
Intentaré escribir esto como un tutorial para que sea fácil de seguir.
NOTA: Este tutorial solo funciona para imágenes raspbian antiguas. Para el Raspbian más nuevo basado en Debian Buster, consulte el siguiente procedimiento en este hilo: https://stackoverflow.com/a/58559140/869402
Pre requisitos
Antes de comenzar, debe asegurarse de que esté instalado lo siguiente:
¡Hagamos una compilación cruzada de un Pie!
Comience creando una carpeta en su directorio de inicio llamada
raspberrypi
.Vaya a esta carpeta y despliegue la carpeta de herramientas COMPLETA que mencionó anteriormente:
Querías usar el siguiente de los 3
gcc-linaro-arm-linux-gnueabihf-raspbian
, si no leía mal.Vaya a su directorio de inicio y agregue:
al final del archivo llamado
~/.bashrc
Ahora puede cerrar la sesión y volver a iniciarla (es decir, reiniciar la sesión de su terminal), o ejecutar
. ~/.bashrc
en su terminal para recoger elPATH
adición en su sesión de terminal actual.Ahora, verifique que puede acceder al compilador
arm-linux-gnueabihf-gcc -v
. Debería obtener algo como esto:¡Pero hey! ¡Hice eso y las librerías todavía no funcionan!
¡Aún no hemos terminado! Hasta ahora, solo hemos hecho lo básico.
En su
raspberrypi
carpeta, cree una carpeta llamadarootfs
.Ahora necesita copiar todo el directorio
/lib
y/usr
en esta carpeta recién creada. Por lo general, abro la imagen rpi y la copio a través de rsync:donde
192.168.1.PI
se reemplaza por la IP de su Raspberry Pi.Ahora, necesitamos escribir un
cmake
archivo de configuración. Abra~/home/raspberrypi/pi.cmake
en su editor favorito e inserte lo siguiente:Ahora debería poder compilar sus
cmake
programas simplemente agregando esta bandera adicional:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Usando un ejemplo de cmake hello world :
fuente
ia32-libs
paquete no está disponible en Ubuntu 13.10. Usé en sulibc6-i386 lib32z1 lib32stdc++6
lugar.Construyendo para nuevas imágenes Raspbian Debian Buster y ARMv6
La respuesta de @Stenyg solo funciona para imágenes de Raspbian más antiguas. El Raspbian recientemente lanzado basado en Debian Buster requiere una cadena de herramientas actualizada:
En Debian Buster, el compilador gcc y glibc se actualizaron a la versión 8.3. La cadena de herramientas de
git://github.com/raspberrypi/tools.git
todavía se basa en la versión anterior de gcc 6. Esto significa que el usogit://github.com/raspberrypi/tools.git
dará lugar a muchos errores de compilación.Este tutorial se basa en la respuesta de @Stenyg. Además de muchas otras soluciones en Internet, este tutorial también es compatible con Rasperry Pi (A, B, B +, Zero ) más antiguo basado en la CPU ARMv6. Ver también: GCC 8 Cross Compiler genera ejecutables ARMv7 en lugar de ARMv6
Configurar la cadena de herramientas
No hay un repositorio oficial de git que contenga una cadena de herramientas actualizada (consulte https://github.com/raspberrypi/tools/issues/102 ).
Creé un nuevo repositorio de github que incluye la construcción y cadenas de herramientas precompiladas para ARMv6 basadas en GCC8 y versiones posteriores:
https://github.com/Pro/raspi-toolchain
Como se menciona en el archivo Léame del proyecto, estos son los pasos para obtener la cadena de herramientas. También puede crearlo usted mismo (consulte el archivo README para obtener más detalles).
/opt/cross-pi-gcc
ya que no es independiente de la ubicación.¡Estás listo! La cadena de herramientas está ahora en
/opt/cross-pi-gcc
Opcional, agregue la cadena de herramientas a su ruta, agregando:
al final del archivo llamado
~/.bashrc
Ahora puede cerrar la sesión y volver a iniciarla (es decir, reiniciar su sesión de terminal), o ejecutar
. ~/.bashrc
en su terminal para recoger laPATH
adición en su sesión de terminal actual.Obtenga las bibliotecas de Raspberry PI
Para realizar una compilación cruzada para su propia Raspberry Pi, que puede tener algunas bibliotecas personalizadas instaladas, debe obtener estas bibliotecas en su host.
Crea una carpeta
$HOME/raspberrypi
. En suraspberrypi
carpeta, cree una carpeta llamadarootfs
.Ahora necesita copiar todo el directorio
/lib
y/usr
en esta carpeta recién creada. Por lo general, abro la imagen rpi y la copio a través de rsync:donde
192.168.1.PI
se reemplaza por la IP de su Raspberry Pi.Usa CMake para compilar tu proyecto
Para decirle a CMake que tome su propia cadena de herramientas, debe tener un archivo de cadena de herramientas que inicialice la configuración del compilador.
Obtenga este archivo de cadena de herramientas desde aquí: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Ahora debería poder compilar sus
cmake
programas simplemente agregando este indicador adicional:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
y configurando las variables de entorno correctas:Aquí se muestra un ejemplo de hola mundo: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
fuente
--safe-links
argumento/opt/cross-pi-gcc
?No pude conseguir el compilador (
x64
versión) para utilizar elsysroot
hasta que he añadidoSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
api.cmake
.fuente
Para el host de Windows, quiero recomendar este tutorial :
¡Nada más y nada menos!
Cadenas de herramientas GNU prediseñadas disponibles para Raspberry, Beaglebone, Cubieboard, AVR (Atmel) y más
fuente
También puedes usar clang . Solía ser más rápido que GCC, y ahora es bastante estable. Es mucho más fácil generar ruido a partir de fuentes ( realmente puedes beber una taza de café durante el proceso de construcción ).
En breve:
Compila tu código:
Opcionalmente, puede usar legacy arm-linux-gnueabihf binutils. Entonces puede quitar la bandera "-fuse-ld = lld" al final.
A continuación se muestra mi archivo de cadena de herramientas cmake.
toolchain.cmake
fuente
No pude compilar QT5 con ninguna de las cadenas de herramientas (bastante desactualizadas) de git: //github.com/raspberrypi/tools.git. El script de configuración seguía fallando con un error de "no se pudo determinar la arquitectura" y con problemas masivos de ruta para los directorios de inclusión. Lo que funcionó para mí fue usar la cadena de herramientas Linaro
en combinación con
No arreglar los enlaces simbólicos del sysroot conduce a errores de símbolo indefinidos como se describe aquí: Un error al construir bibliotecas Qt para el raspberry pi Esto 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:
siendo / usr / local / rasp / sysroot la ruta de mi copia del sistema local Raspberry Pi 3 Raspbian (Jessie) y / usr / local / qt5pi la ruta del QT compilado 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.
fuente
La pregunta inicial se publicó hace bastante tiempo y, mientras tanto, Debian ha avanzado mucho en el área de soporte multiarca.
¡Multiarch es un gran logro para la compilación cruzada!
En pocas palabras, se requieren los siguientes pasos para aprovechar el multiarch para la compilación cruzada de Raspbian Jessie:
Dado que esto es mucho trabajo, he automatizado la configuración anterior. Usted puede leer sobre ello aquí:
Compilación cruzada para Raspbian
fuente
hay un IDE de CDP Studio disponible que hace que la compilación cruzada y la implementación sean bastante simples tanto desde Windows como desde Linux, y puede marcar la casilla de verificación de la cadena de herramientas de 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 del uso de frambuesa está aquí: https://youtu.be/4SVZ68sQz5U
y puede descargar el IDE aquí: https://cdpstudio.com/home-edition
fuente