Я пытаюсь выполнить кросс-компиляцию для Raspberry Pi, работающего на моем компьютере с Ubuntu.
Во время первых попыток я использовал компилятор arm-linux-gnueabi, который доступен в репозитории Ubuntu. У меня это работает. Я смог построить все свои зависимости и использовать кросс-компилятор в моем проекте cmake.
Однако я считаю, что мне следует использовать версию hf, поэтому я переключился на arm-linux-gnueabihf. Потом я понял, что это не работает с Raspberry Pi, так как это armv6.
После некоторого поиска в Google я нашел готовую цепочку инструментов от 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)
Если я перейду в папку INNER bin, я смогу без проблем скомпилировать тестовую программу с терминала.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Затем я попытался скомпилировать тестовую программу в папке OUTER 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 в свой PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Однако это приводит к той же ошибке. Как мне «установить» инструментальную цепочку, чтобы я мог использовать инструментальную цепочку отовсюду, точно так же, как я могу использовать кросс-компиляторы из репозитория Ubuntu?
Ответы:
Я постараюсь написать это как учебное пособие для вас, чтобы вам было легко следовать.
ПРИМЕЧАНИЕ. Это руководство работает только для старых образов raspbian. Для нового Raspbian на основе Debian Buster см. Следующие инструкции в этой теме: https://stackoverflow.com/a/58559140/869402
Предварительно требования
Перед тем, как начать, вам необходимо убедиться, что установлено следующее:
Давайте кросс-компилируем пирог!
Начните с создания папки в вашем домашнем каталоге с именем
raspberrypi
.Войдите в эту папку и вытащите всю папку с инструментами, которую вы упомянули выше:
Вы хотели использовать следующие из трех
gcc-linaro-arm-linux-gnueabihf-raspbian
, если я не неправильно прочитал.Зайдите в свой домашний каталог и добавьте:
в конец файла с именем
~/.bashrc
Теперь вы можете либо выйти из системы и снова войти в систему (т.е. перезапустить сеанс терминала), либо запустить
. ~/.bashrc
в своем терминале, чтобы выбратьPATH
добавление в текущем сеансе терминала.Теперь убедитесь, что у вас есть доступ к компилятору
arm-linux-gnueabihf-gcc -v
. У вас должно получиться что-то вроде этого:Но эй! Я сделал это, но библиотеки по-прежнему не работают!
Мы еще не закончили! Пока что мы сделали только основы.
В своей
raspberrypi
папке создайте папку с именемrootfs
.Теперь вам нужно скопировать весь
/lib
и/usr
каталог в эту вновь созданную папку. Обычно я загружаю изображение rpi и копирую его через rsync:где
192.168.1.PI
заменяется IP-адресом вашего Raspberry Pi.Теперь нам нужно написать
cmake
файл конфигурации. Откройте~/home/raspberrypi/pi.cmake
в своем любимом редакторе и вставьте следующее:Теперь вы должны быть в состоянии компилировать
cmake
программы , просто добавив этот дополнительный флаг:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Используя пример cmake hello world :
источник
ia32-libs
Пакет не доступен на Ubuntu 13.10. Я использовалlibc6-i386 lib32z1 lib32stdc++6
вместо этого.Сборка новых образов Raspbian Debian Buster и ARMv6
Ответ @Stenyg работает только для старых изображений Raspbian. Недавно выпущенный Raspbian на основе Debian Buster требует обновленного набора инструментов:
В Debian Buster компилятор gcc и glibc были обновлены до версии 8.3. Набор инструментов по-
git://github.com/raspberrypi/tools.git
прежнему основан на более старой версии gcc 6. Это означает, что использованиеgit://github.com/raspberrypi/tools.git
приведет к множеству ошибок компиляции.Это руководство основано на ответе @Stenyg. В дополнение ко многим другим решениям в Интернете, это руководство также поддерживает более старые Rasperry Pi (A, B, B +, Zero ) на базе процессора ARMv6. См. Также: Кросс-компилятор GCC 8 выводит исполняемый файл ARMv7 вместо ARMv6
Настроить набор инструментов
Не существует официального репозитория git, содержащего обновленную цепочку инструментов (см. Https://github.com/raspberrypi/tools/issues/102 ).
Я создал новый репозиторий github, который включает в себя сборку и предварительно скомпилированные наборы инструментов для ARMv6 на основе GCC8 и новее:
https://github.com/Pro/raspi-toolchain
Как упоминалось в файле readme проекта, это шаги для получения набора инструментов. Вы также можете создать его самостоятельно (подробности см. В README).
/opt/cross-pi-gcc
поскольку она не зависит от местоположения.Вы сделали! Набор инструментов теперь в
/opt/cross-pi-gcc
Необязательно, добавьте цепочку инструментов к своему пути, добавив:
в конец файла с именем
~/.bashrc
Теперь вы можете либо выйти из системы и снова войти в систему (т.е. перезапустить сеанс терминала), либо запустить
. ~/.bashrc
в своем терминале, чтобы выбратьPATH
добавление в текущем сеансе терминала.Получите библиотеки от Raspberry PI
Чтобы выполнить кросс-компиляцию для вашего собственного Raspberry Pi, в котором могут быть установлены некоторые пользовательские библиотеки, вам необходимо разместить эти библиотеки на своем хосте.
Создайте папку
$HOME/raspberrypi
. В своейraspberrypi
папке создайте папку с именемrootfs
.Теперь вам нужно скопировать весь
/lib
и/usr
каталог в эту вновь созданную папку. Обычно я загружаю изображение rpi и копирую его через rsync:где
192.168.1.PI
заменяется IP-адресом вашего Raspberry Pi.Используйте CMake для компиляции вашего проекта
Чтобы указать CMake использовать вашу собственную цепочку инструментов, вам нужен файл цепочки инструментов, который инициализирует настройки компилятора.
Получите этот файл инструментальной цепочки отсюда: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Теперь вы сможете компилировать свои
cmake
программы, просто добавив этот дополнительный флаг:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
и установив правильные переменные среды:Здесь показан пример приветственного мира: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
источник
--safe-links
аргумента/opt/cross-pi-gcc
?Я не мог получить компилятор (
x64
версии) , чтобы использовать ,sysroot
пока я не добавилSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
кpi.cmake
.источник
Для хоста Windows я очень рекомендую этот учебник :
Ни больше ни меньше!
Готовые наборы инструментов GNU доступны для Raspberry, Beaglebone, Cubieboard, AVR (Atmel) и др.
источник
Вы также можете использовать clang . Раньше он был быстрее, чем GCC, а теперь это довольно стабильная вещь. Строить clang из исходников намного проще ( вы действительно можете выпить чашку кофе в процессе сборки ).
Коротко:
Скомпилируйте свой код:
При желании вы можете использовать устаревший binutils arm-linux-gnueabihf. Затем вы можете убрать в конце флаг "-fuse-ld = lld".
Ниже мой файл инструментальной цепочки cmake.
toolchain.cmake
источник
Мне не удалось скомпилировать QT5 ни с одним (довольно устаревшим) набором инструментов из git: //github.com/raspberrypi/tools.git. Сценарий настройки продолжал давать сбой с ошибкой «не удалось определить архитектуру» и с серьезными проблемами пути для подключаемых каталогов. Что сработало для меня, так это использование набора инструментов Linaro
в комбинации с
Неспособность исправить символические ссылки sysroot приводит к неопределенным символьным ошибкам, как описано здесь: Ошибка при создании библиотек Qt для raspberry pi. Это случилось со мной, когда я попробовал скрипт fixQualifiedLibraryPaths из tools.git. Все остальное подробно описано в http://wiki.qt.io/RaspberryPi2EGLFS . Мои настройки конфигурации были:
где / usr / local / rasp / sysroot - это путь к моей локальной копии системы Raspberry Pi 3 Raspbian (Jessie), а / usr / local / qt5pi - это путь кросс-скомпилированного QT, который также должен быть скопирован на устройство. Помните, что Jessie поставляется с GCC 4.9.2, когда вы выбираете свою инструментальную цепочку.
источник
Первоначальный вопрос был опубликован довольно давно, а тем временем Debian значительно продвинулся в области поддержки мультиархитектурности.
Мультиархия - отличное достижение для кросс-компиляции!
Вкратце, для использования мультиархитектуры для кросс-компиляции Raspbian Jessie требуются следующие шаги:
Поскольку это большая работа, я автоматизировал вышеуказанную настройку. Вы можете прочитать об этом здесь:
Кросс-компиляция для Raspbian
источник
доступна IDE CDP Studio, которая упрощает кросс-компиляцию и развертывание как из Windows, так и из Linux, и вы можете просто установить флажок Raspberry Toolchain во время установки. (PS. Он имеет поддержку GPIO и I2C, поэтому для доступа к ним код не требуется)
Демонстрация использования малины в IDE находится здесь: https://youtu.be/4SVZ68sQz5U
и вы можете скачать IDE здесь: https://cdpstudio.com/home-edition
источник