J'essaie de faire de la compilation croisée pour que Raspberry Pi fonctionne sur ma machine Ubuntu.
Lors de mes premières tentatives, j'utilisais le compilateur arm-linux-gnueabi, disponible dans le référentiel Ubuntu. Je travaille ça. J'ai pu construire toutes mes dépendances et utiliser le compilateur croisé dans mon projet cmake.
Cependant, je crois que je devrais utiliser la version hf, alors je suis passé à arm-linux-gnueabihf. Ensuite, j'ai réalisé que cela ne fonctionnait pas avec Raspberry Pi puisqu'il était armv6.
Après quelques recherches sur Google, j’ai trouvé le chaîne d’outils pré-construite de GitHub .
J'ai téléchargé le toolchain, mais je ne comprends pas vraiment comment "l'installer". J'ai extrait les fichiers dans mon répertoire personnel. La structure du répertoire ressemble à ceci:
/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 je change de répertoire dans le dossier bin INNER, je peux compiler un programme de test à partir du terminal sans aucun problème.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
J'ai ensuite essayé de compiler un programme de test dans le dossier OUTER bin, qui contient les versions préfixées des outils.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
Cependant, lorsque j'essaie d'utiliser le compilateur maintenant (en dehors du répertoire bin interne), il est impossible de trouver la bibliothèque partagée libstdc ++ fournie avec la chaîne d'outils:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
De plus, je veux pouvoir utiliser le compilateur sans avoir à naviguer dans le répertoire bin. J'ai donc essayé d'ajouter le répertoire OUTER bin (puisque je veux les versions préfixées) et les deux répertoires lib dans mon PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Cependant, cela entraîne la même erreur. Comment dois-je "installer" la chaîne d’outils pour pouvoir l’utiliser de partout, comme je le fais quand j’utilise les compilateurs croisés du référentiel Ubuntu?
Je vais essayer d'écrire ceci comme tutoriel pour vous afin qu'il devienne facile à suivre.
Avant de commencer, vous devez vous assurer que les éléments suivants sont installés:
apt-get install git rsync cmake ia32-libs
Commencez par créer un dossier dans votre répertoire personnel appelé raspberrypi
.
Allez dans ce dossier et déroulez le dossier ENTIRE outils que vous avez mentionné ci-dessus:
git clone git://github.com/raspberrypi/tools.git
Vous vouliez utiliser la suite des 3, gcc-linaro-arm-linux-gnueabihf-raspbian
, si je ne lisais pas mal.
Allez dans votre répertoire personnel et ajoutez:
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
à la fin du fichier nommé ~/.bashrc
Maintenant, vous pouvez soit vous déconnecter et vous reconnecter (c'est-à-dire redémarrer votre session de terminal), soit exécuter . ~/.bashrc
sur votre terminal pour récupérer l'addition PATH
dans votre session de terminal actuelle.
Maintenant, vérifiez que vous pouvez accéder au compilateur arm-linux-gnueabihf-gcc -v
. Vous devriez obtenir quelque chose comme ça:
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
)
Nous n'avons pas encore fini! Jusqu'ici, nous avons seulement fait les bases.
Dans votre dossier raspberrypi
, créez un dossier nommé rootfs
.
Vous devez maintenant copier le répertoire entier /lib
et /usr
dans ce dossier nouvellement créé. J'apporte généralement l'image rpi et la copie via rsync:
rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs
où 192.168.1.PI
est remplacé par l'adresse IP de votre Raspberry Pi.
Maintenant, nous devons écrire un fichier de configuration cmake
. Ouvrez ~/home/raspberrypi/pi.cmake
dans votre éditeur favori et insérez les éléments suivants:
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)
Vous devriez maintenant pouvoir compiler vos programmes cmake
en ajoutant simplement cet indicateur supplémentaire: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.
Utilisation d'un exemple 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
Je ne pouvais pas faire en sorte que le compilateur (x64
version) utilise le sysroot
tant que j’ai ajouté SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
à pi.cmake
.
Pour Windows Host, je recommande vivement ce tutoriel: :
Ni plus ni moins!
Prebuilt GNU Chaînes d'outils disponibles pour Raspberry, Beaglebone, Cubieboard, AVR (Atmel) et plus
Vous pouvez aussi utiliser clang . Auparavant, c'était plus rapide que GCC, et maintenant c'est une chose assez stable. Il est beaucoup plus facile de créer une source à partir de sources (, vous pouvez vraiment boire une tasse de café pendant le processus de fabrication ).
En bref:
Compilez votre code:
path/to/clang --target=arm-linux-gnueabihf --sysroot=/some/path/arm-linux-gnueabihf/sysroot my-happy-program.c -Fuse-ld=lld
En option, vous pouvez utiliser les anciens binutils arm-linux-gnueabihf. Ensuite, vous pouvez supprimer le drapeau "-Fuse-ld = lld" à la fin.
Ci-dessous, mon fichier de chaîne d'outils cmake.
toolchain.cmake
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# Custom toolchain-specific definitions for your project
set(PLATFORM_ARM "1")
set(PLATFORM_COMPILE_DEFS "COMPILE_GLES")
# There we go!
# Below, we specify toolchain itself!
set(TARGET_TRIPLE arm-linux-gnueabihf)
# Specify your target rootfs mount point on your compiler Host machine
set(TARGET_ROOTFS /Volumes/rootfs-${TARGET_TRIPLE})
# Specify clang paths
set(LLVM_DIR /Users/stepan/projects/shared/toolchains/llvm-7.0.darwin-release-x86_64/install)
set(CLANG ${LLVM_DIR}/bin/clang)
set(CLANGXX ${LLVM_DIR}/bin/clang++)
# Specify compiler (which is clang)
set(CMAKE_C_COMPILER ${CLANG})
set(CMAKE_CXX_COMPILER ${CLANGXX})
# Specify binutils
set (CMAKE_AR "${LLVM_DIR}/bin/llvm-ar" CACHE FILEPATH "Archiver")
set (CMAKE_LINKER "${LLVM_DIR}/bin/llvm-ld" CACHE FILEPATH "Linker")
set (CMAKE_NM "${LLVM_DIR}/bin/llvm-nm" CACHE FILEPATH "NM")
set (CMAKE_OBJDUMP "${LLVM_DIR}/bin/llvm-objdump" CACHE FILEPATH "Objdump")
set (CMAKE_RANLIB "${LLVM_DIR}/bin/llvm-ranlib" CACHE FILEPATH "ranlib")
# You may use legacy binutils though.
#set(BINUTILS /usr/local/Cellar/arm-linux-gnueabihf-binutils/2.31.1)
#set (CMAKE_AR "${BINUTILS}/bin/${TARGET_TRIPLE}-ar" CACHE FILEPATH "Archiver")
#set (CMAKE_LINKER "${BINUTILS}/bin/${TARGET_TRIPLE}-ld" CACHE FILEPATH "Linker")
#set (CMAKE_NM "${BINUTILS}/bin/${TARGET_TRIPLE}-nm" CACHE FILEPATH "NM")
#set (CMAKE_OBJDUMP "${BINUTILS}/bin/${TARGET_TRIPLE}-objdump" CACHE FILEPATH "Objdump")
#set (CMAKE_RANLIB "${BINUTILS}/bin/${TARGET_TRIPLE}-ranlib" CACHE FILEPATH "ranlib")
# Specify sysroot (almost same as rootfs)
set(CMAKE_SYSROOT ${TARGET_ROOTFS})
set(CMAKE_FIND_ROOT_PATH ${TARGET_ROOTFS})
# Specify lookup methods for cmake
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# Sometimes you also need this:
# set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# Specify raspberry triple
set(CROSS_FLAGS "--target=${TARGET_TRIPLE}")
# Specify other raspberry related flags
set(RASP_FLAGS "-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
# Gather and distribute flags specified at prev steps.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")
# Use clang linker. Why?
# Well, you may install custom arm-linux-gnueabihf binutils,
# but then, you also need to recompile clang, with customized triple;
# otherwise clang will try to use Host 'ld' for linking,
# so... use clang linker.
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Fuse-ld=lld)
La question initiale a été postée il y a quelque temps déjà et entre-temps, Debian a fait d'énormes progrès dans le domaine du support multiarch.
Multiarch est une grande réussite pour la compilation croisée!
En résumé, les étapes suivantes sont nécessaires pour exploiter le multiarch pour la compilation croisée Raspbian Jessie:
Comme cela représente beaucoup de travail, j'ai automatisé la configuration ci-dessus. Vous pouvez lire à ce sujet ici:
Je ne pouvais pas compiler QT5 avec les chaînes d'outils (relativement obsolètes) de git: //github.com/raspberrypi/tools.git. Le script de configuration a continué à échouer avec une erreur "Impossible de déterminer l'architecture" et des problèmes de chemin considérables pour les répertoires include. Ce qui a fonctionné pour moi a été d'utiliser la chaîne d'outils Linaro
en combinaison avec
https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
Ne pas résoudre les liens symboliques de la racine système entraîne des erreurs de symbole non définies comme décrit ici: ne erreur lors de la création de bibliothèques Qt pour Raspberry Pi Cela m'est arrivé lorsque j'ai essayé le script fixQualifiedLibraryPaths de tools.git. Tout le reste est décrit en détail dans http://wiki.qt.io/RaspberryPi2EGLFS . Mes paramètres de configuration étaient:
./configure -opengl es2 -device linux-rpi3-g ++ - option-dispositif CROSS_COMPILE =/usr/local/rasp/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm linux-gnueabihf/usr/local/rasp/sysroot -opensource -confirm-license -optimized-qmake -reduce-exports-release-release -make libs -prefix/usr/local/qt5pi -hostprefix/usr/local/qt5pi
avec/usr/local/rasp/sysroot étant le chemin de ma copie système Raspberry Pi 3 Raspbian (Jessie) locale et/usr/local/qt5pi étant le chemin du fichier QT compilé de façon croisée, qui doit également être copié sur le périphérique. Sachez que Jessie vient avec GCC 4.9.2 lorsque vous choisissez votre chaîne d’outils.
il existe un CDP Studio IDE qui facilite la compilation croisée et le déploiement depuis Windows et Linux. Vous pouvez simplement cocher la case Chaîne d'outils Framboise lors de l'installation. (PS. Il supporte GPIO et I2C, aucun code n’est nécessaire pour y accéder)
La démo IDE d'utilisation de la framboise se trouve ici: https://youtu.be/4SVZ68sQz5
et vous pouvez télécharger le IDE ici: https://cdpstudio.com/home-edition
Aucune compilation ou installation à partir de rien n'est requise. Les fichiers binaires inter-compilateurs sont facilement disponibles et peuvent être utilisés sur n’importe quelle machine Linux (testés sur la dernière version d'Ubuntu/bionic x64) pour compiler des programmes pour votre Raspberry Pi. De plus, tous les fichiers binaires de ces compilateurs sont du matériel Raspberry Pi optimisé pour améliorer les performances globales.
Les versions de GCC actuellement prises en charge sont les suivantes:
J'espère que ça aide, merci :)