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


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

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

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

После некоторого гугления я нашел предварительно собранную цепочку инструментов из GitHub.

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

/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++, которая поставляется с цепочкой инструментов:

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

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

7 96

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
 )

Но эй! Я сделал это, а либералы до сих пор не делают. работа!

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

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

Теперь вам нужно скопировать весь каталог /libи /usr в эту только что созданную папку. Обычно я поднимаю изображение rpi и копирую его через rsync:
rsync -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr} $HOME/raspberrypi/rootfs

Где 192.168.1.PI заменяется IP вашего Raspberry Pi.

Теперь нам нужно написать конфигурационный файл cmake. Откройте ~/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 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 pi@192.168.1.PI:/home/pi/
ssh pi@192.168.1.PI ./CMakeHelloWorld

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

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

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

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

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

Я не смог скомпилировать QT5 ни с одной из (довольно устаревших) цепочек инструментов из git://github.com/raspberrypi / tools.git. сценарий configure продолжал отказывать с ошибкой "не удалось определить архитектуру" и с массивными проблемами пути для каталогов 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 . Мои настройки configure были следующими:

./настроить -поддержка 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 -уменьшить-экспорт-релиза-сделать библиотеки - prefix /usr / local/qt5pi-hostprefix/usr/local / qt5pi

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

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

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

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

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

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

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

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

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

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

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

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

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