Construyendo para imágenes más nuevas de Raspbian Debian Buster y ARMv6
La respuesta de @Stenyg solo funciona para imágenes antiguas de Raspbian. El Raspbian lanzado recientemente 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 en git://github.com/raspberrypi/tools.git
todavía se basa en la versión anterior de gcc 6. Esto significa que usar git://github.com/raspberrypi/tools.git
conducirá 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 versiones anteriores de Rasperry Pi (A, B, B+, Zero ) basado en la CPU ARMv6. Ver también:GCC 8 Cross Compiler genera el ejecutable ARMv7 en lugar de ARMv6
Configurar la cadena de herramientas
No existe 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 más nuevas:
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 LÉAME para obtener más detalles).
- Descargue la cadena de herramientas:
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
- Extráigalo. Nota:La cadena de herramientas debe estar en
/opt/cross-pi-gcc
ya que no es independiente de la ubicación.
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
-
¡Estás listo! La cadena de herramientas ahora está en
/opt/cross-pi-gcc
-
Opcional, agregue la cadena de herramientas a su ruta, agregando:
export PATH=$PATH:/opt/cross-pi-gcc/bin
hasta el 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 tu terminal para recoger el PATH
adición en su sesión de terminal actual.
Obtenga las bibliotecas de Raspberry PI
Para compilar de forma cruzada para su propia Raspberry Pi, que puede tener algunas bibliotecas personalizadas instaladas, debe obtener estas bibliotecas en su host.
Crear una carpeta $HOME/raspberrypi
.En tu raspberrypi
carpeta, cree una carpeta llamada rootfs
.
Ahora necesitas copiar todo el /lib
y /usr
directorio a esta carpeta recién creada. Por lo general, abro la imagen rpi y la copio a través de rsync:
rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
donde 192.168.1.PI
se reemplaza por la IP de su Raspberry Pi.
Use CMake para compilar su 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 su cmake
programas simplemente agregando esta bandera extra:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
y configurando las variables de entorno correctas:
export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
export PATH=/opt/cross-pi-gcc/bin:$PATH
export RASPBERRY_VERSION=1
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..
Aquí se muestra un ejemplo de hola mundo:https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
Intentaré escribir esto como un tutorial para que sea fácil de seguir.
NOTA:este tutorial solo funciona con imágenes antiguas de raspbian. Para el Raspbian más nuevo basado en Debian Buster, consulte el siguiente procedimiento en este hilo:https://stackoverflow.com/a/58559140/869402
Requisitos previos
Antes de comenzar, debe asegurarse de que esté instalado lo siguiente:
apt-get install git rsync cmake libc6-i386 lib32z1 lib32stdc++6
¡Vamos a compilar un Pie!
Comience creando una carpeta en su directorio de inicio llamada 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 leí mal.
Vaya a su directorio de inicio 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
en tu terminal para recoger el PATH
adición en su sesión de terminal actual.
Ahora, verifica que puedes acceder al compilador arm-linux-gnueabihf-gcc -v
. Debería 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 oye! ¡Hice eso y las bibliotecas siguen sin funcionar!
¡Aún no hemos terminado! Hasta ahora, solo hemos hecho lo básico.
En tu raspberrypi
carpeta, crea una carpeta llamada rootfs
.
Ahora necesitas copiar todo el /lib
y /usr
directorio a esta carpeta recién creada. Por lo general, abro 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 reemplaza por la IP de su Raspberry Pi.
Ahora, necesitamos escribir un cmake
archivo de configuración. Abrir ~/home/raspberrypi/pi.cmake
en tu editor favorito e inserta 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 su cmake
programas simplemente agregando esta bandera extra:-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