Как установить Raspberry Pi cross compiler на моем хост-компьютере Linux?



Я пытаюсь получить кросс-компиляцию для Raspberry Pi, работающей на моей машине Ubuntu.



во время моих первых попыток я использовал компилятор arm-linux-gnueabi, который доступен в репозитории Ubuntu. У меня это работает. Я смог построить все свои зависимости и использовать кросс-компилятор в своем проекте cmake.



тем не менее, я считаю, что я должен использовать версию hf, поэтому я переключился на arm-linux-gnueabihf. Тогда я понял, что это не работает с Raspberry Pi, так как это armv6.



после некоторого Googling, я тогда нашел встроенных инструментов для работы с GitHub.



Я загрузил инструментальную цепочку, но я действительно не понимаю, как ее "установить". Я извлек файлы в свой домашний каталог. Структура каталогов выглядит так:



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


если я меняю каталог на внутреннюю папку bin, я могу без проблем скомпилировать тестовую программу с терминала.



~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test


затем я попробовал для компиляции тестовой программы во внешнюю папку bin, которая содержит префиксные версии инструментов.



 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
arm-linux-gnueabihf-g++ test.cpp -o test


однако, когда я пытаюсь использовать компилятор сейчас (вне внутреннего каталога bin), он не может найти общую библиотеку libstdc++, которая поставляется с toolchain:



arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.


кроме того, я хочу иметь возможность использовать компилятор, без необходимости переходить в каталог bin. Поэтому я попытался добавить внешний каталог bin (так как я хочу префикс версии) и оба каталога lib для моего пути:



export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib


однако это приводит к той же ошибке. Как я должен" установить " toolchain, чтобы я мог использовать toolchain отовсюду, так же, как я могу, когда я использую кросс-компиляторы из РЕПО Ubuntu?

983   7  

7 ответов:

я постараюсь написать это в качестве учебника для вас, так что становится легко следовать.

предварительные требования

перед началом работы необходимо убедиться, что установлено следующее:

apt-get install git rsync cmake ia32-libs

давайте скомпилируем пирог!

начните с создания папки в вашем домашнем каталоге под названием raspberrypi.

перейдите в эту папку и потяните вниз всю папку инструментов, которую вы упомянули выше:

git clone git://github.com/raspberrypi/tools.git

вы хотели используйте следующие из 3-х,gcc-linaro-arm-linux-gnueabihf-raspbian, если я не читал неправильно.

зайдите в свой домашний каталог и добавьте:

export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

до конца файла с именем ~/.bashrc

теперь вы можете либо выйти из системы и войти обратно (т. е. перезапустить сеанс терминала), либо запустить . ~/.bashrc в вашем терминале, чтобы забрать PATH добавление в текущую терминальную сессию.

теперь, убедитесь, что вы можете получить доступ к компилятору arm-linux-gnueabihf-gcc -v. Вы должны получить что-то вроде это:

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
 )

но эй! Я сделал это, и libs все еще не работает!

мы еще не закончили! До сих пор мы делали только основы.

в своем raspberrypi папка, сделайте папку под названием rootfs.

теперь вам нужно скопировать весь /libи /usr каталог для этой вновь созданной папки. Я обычно поднимаю изображение rpi и копирую его через rsync:

rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs

здесь 192.168.1.PI заменяется на IP-адрес вашего Raspberry Пи.

теперь нам нужно написать cmake файл config. Открой ~/home/raspberrypi/pi.cmake в вашем любимом редакторе и вставить следующее:

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)
вы должны быть в состоянии скомпилировать cmake программы просто добавив этот дополнительный флаг:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake.

С помощью cmake Привет мир пример:

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

Я не мог заставить компилятор (x64 версию), чтобы использовать sysroot пока я не добавил SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs) до pi.cmake.

для хоста Windows, я хочу настоятельно рекомендуем в этом уроке::

  • Загрузите и установите toolchain
  • синхронизация sysroot с каталогами RPi include/lib
  • скомпилировать ваш код
  • перетащите исполняемый файл в ваш RPi с помощью SmarTTY
  • запустить его!

ни больше, ни меньше!

готовые GNU Toolchains доступны для Raspberry, Beaglebone, Cubieboard, AVR (Atmel) и многое другое

Я не мог скомпилировать QT5 с любой из (довольно устаревших) цепочек инструментов из git://github.com/raspberrypi/tools.git. сценарий настройки продолжал терпеть неудачу с ошибкой "не удалось определить архитектуру" и с массивными проблемами пути для каталогов include. То, что сработало для меня, использовало инструментальную цепочку Linaro

http://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/runtime-linaro-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz

в сочетании с

https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

неспособность исправить символические ссылки sysroot приводит к неопределенным ошибкам символов, как описано здесь:ошибка создание библиотек Qt для raspberry pi Это произошло со мной, когда я попробовал скрипт fixQualifiedLibraryPaths из tools.мерзавец. Все остальное подробно описано в http://wiki.qt.io/RaspberryPi2EGLFS . Мои настройки настройки были:

./настроить -поддержка OpenGL ES2 прекрасно -устройство Linux-rpi3-г++ -устройство-опция CROSS_COMPILE=/usr/local/rasp/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /usr/местные/рашпиль/sysroot -с открытым исходным кодом -подтверждения лицензии -оптимизированный-то qmake -уменьшить-экспорт-релиза-сделать библиотеки -префикс /usr/местные/qt5pi -hostprefix /usr/местные/qt5pi

с /usr/local/rasp /sysroot, являющимся путем моей локальной копии системы Raspberry Pi 3 Raspbian (Jessie) и/usr/local / qt5pi, являющимся путем кросс-скомпилированного QT, который также должен быть скопирован на устройство. Имейте в виду, что Jessie поставляется с GCC 4.9.2, когда вы выбираете свою цепочку инструментов.

первоначальный вопрос был опубликован довольно давно, и в то же время в Debian добилась огромного прогресса в области поддержки multiarch.

Multiarch-это большое достижение для кросс-компиляции!

в двух словах следующие шаги необходимы для использования multiarch для Raspbian Jessie cross compilation:

  • на вашем Хосте Ubuntu установите Debian Jessie amd64 в контейнере chroot или LXC.
  • включить внешний архитектура языка.
  • установите кросс-компилятор из репозитория emdebian tools.
  • настроить кросс-компилятор (он будет генерировать код для ARMv7-a по умолчанию), написав пользовательский файл спецификаций gcc.
  • установить библиотеки armhf (libstdc++ и др.) из хранилища Raspbian.
  • создайте свой исходный код.

Так как это много работы я автоматизировал выше настройки. Вы можете прочитать об этом здесь:

крест Компиляции для Raspbian

есть CDP Studio IDE доступны, что делает кросс-компиляцию и развертывание довольно просто из windows и linux, и вы можете просто проверить флажок raspberry toolchain во время установки. (ПС. он имеет поддержку GPIO и I2C, поэтому для доступа к ним не требуется код)

демонстрация IDE использования малины находится здесь: https://youtu.be/4SVZ68sQz5U

и вы можете скачать IDE здесь:https://cdpstudio.com/home-edition

Я создал последний набор предварительно скомпилированных Кросс-компиляторов Raspberry Pi GCC / собственных двоичных файлов (самый простой метод):

Raspberry Pi GCC Кросс-компиляторы / собственные двоичные файлы (v8.2.0)

наслаждайтесь беспроблемными предварительно скомпилированными Кросс-компиляторами Raspberry pi GCC и сэкономьте свое драгоценное время. Никакой компиляции или обработки ошибок не требуется вообще. Просто Извлечь, Ссылка & Наслаждайтесь полной функциональностью GCC(Raspberry Pi) в вашей машине.

Comments

    Ничего не найдено.