Creazione per immagini Raspbian Debian Buster più recenti e ARMv6
La risposta di @Stenyg funziona solo per le immagini Raspbian precedenti. Il Raspbian recentemente rilasciato basato su Debian Buster richiede una toolchain aggiornata:
In Debian Buster il compilatore gcc e glibc sono stati aggiornati alla versione 8.3. La toolchain in git://github.com/raspberrypi/tools.git
è ancora basato sulla versione precedente di gcc 6. Ciò significa che l'utilizzo di git://github.com/raspberrypi/tools.git
porterà a molti errori di compilazione.
Questo tutorial è basato sulla risposta di @Stenyg. Oltre a molte altre soluzioni in Internet, questo tutorial supporta anche i vecchi Rasperry Pi (A, B, B+, Zero ) basato sulla CPU ARMv6.Vedi anche:GCC 8 Cross Compiler restituisce l'eseguibile ARMv7 invece di ARMv6
Imposta la toolchain
Non esiste un repository git ufficiale contenente una toolchain aggiornata (vedi https://github.com/raspberrypi/tools/issues/102).
Ho creato un nuovo repository github che include la costruzione e toolchain precompilati per ARMv6 basati su GCC8 e successivi:
https://github.com/Pro/raspi-toolchain
Come accennato nel readme del progetto, questi sono i passaggi per ottenere la toolchain. Puoi anche costruirlo tu stesso (vedi il README per ulteriori dettagli).
- Scarica la toolchain:
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
- Estrailo. Nota:la toolchain deve trovarsi in
/opt/cross-pi-gcc
poiché non è indipendente dalla posizione.
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
-
Hai fatto! La toolchain è ora in
/opt/cross-pi-gcc
-
Facoltativo, aggiungi la toolchain al tuo percorso, aggiungendo:
export PATH=$PATH:/opt/cross-pi-gcc/bin
alla fine del file denominato ~/.bashrc
Ora puoi disconnetterti e riconnetterti (ovvero riavviare la sessione del terminale) o eseguire . ~/.bashrc
nel tuo terminale per ritirare il PATH
aggiunta nella sessione corrente del terminale.
Ottieni le librerie dal Raspberry PI
Per eseguire la compilazione incrociata per il tuo Raspberry Pi, che potrebbe avere alcune librerie personalizzate installate, devi caricare queste librerie sul tuo host.
Crea una cartella $HOME/raspberrypi
.Nel tuo raspberrypi
folder, crea una cartella chiamata rootfs
.
Ora devi copiare l'intero /lib
e /usr
directory in questa cartella appena creata. Di solito porto l'immagine rpi e la copio tramite rsync:
rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
dove 192.168.1.PI
è sostituito dall'IP del tuo Raspberry Pi.
Usa CMake per compilare il tuo progetto
Per dire a CMake di prendere la tua toolchain, devi avere un file toolchain che inizializzi le impostazioni del compilatore.
Ottieni questo file di toolchain da qui:https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Ora dovresti essere in grado di compilare il tuo cmake
programmi semplicemente aggiungendo questo flag aggiuntivo:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
e impostando le variabili d'ambiente corrette:
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 ..
Un esempio di hello world è mostrato qui:https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
Cercherò di scriverlo come tutorial per te in modo che sia facile da seguire.
NOTA:questo tutorial funziona solo per le immagini raspbian meno recenti. Per il nuovo Raspbian basato su Debian Buster, vedere la seguente procedura in questo thread:https://stackoverflow.com/a/58559140/869402
Prerequisiti
Prima di iniziare devi assicurarti che quanto segue sia installato:
apt-get install git rsync cmake libc6-i386 lib32z1 lib32stdc++6
Incrociamo la compilazione di una torta!
Inizia creando una cartella nella tua home directory chiamata raspberrypi
.
Entra in questa cartella e apri l'INTERA cartella degli strumenti che hai menzionato sopra:
git clone git://github.com/raspberrypi/tools.git
Volevi usare il seguente dei 3, gcc-linaro-arm-linux-gnueabihf-raspbian
, se non ho letto male.
Vai nella tua home directory e aggiungi:
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
alla fine del file denominato ~/.bashrc
Ora puoi disconnetterti e riconnetterti (ovvero riavviare la sessione del terminale) o eseguire . ~/.bashrc
nel tuo terminale per ritirare il PATH
aggiunta nella sessione corrente del terminale.
Ora verifica di poter accedere al compilatore arm-linux-gnueabihf-gcc -v
. Dovresti ottenere qualcosa del genere:
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
)
Ma ehi! L'ho fatto e le librerie continuano a non funzionare!
Non abbiamo ancora finito! Finora, abbiamo fatto solo le basi.
Nel tuo raspberrypi
folder, crea una cartella chiamata rootfs
.
Ora devi copiare l'intero /lib
e /usr
directory in questa cartella appena creata. Di solito porto l'immagine rpi e la copio tramite rsync:
rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs
dove 192.168.1.PI
è sostituito dall'IP del tuo Raspberry Pi.
Ora dobbiamo scrivere un cmake
file di configurazione. Apri ~/home/raspberrypi/pi.cmake
nel tuo editor preferito e inserisci quanto segue:
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)
Ora dovresti essere in grado di compilare il tuo cmake
programmi semplicemente aggiungendo questo flag aggiuntivo:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.
Usando un esempio di 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