- Для начала что мы имеем:
- Хост с установленным Mint 17.3
- Qt 5.7.0, QtCreator 4.1.0
- Raspberry Pi 3
- Карточка microSD от 8 гигабайт
- Пару часов свободного времени
- Кофе
Первым делом качаем образ системы для малины. В моем случае под рукой оказался raspbian jessie. Другие дистрибутивы легко качаются с оф.сайта. Чтобы проще было работать на этапе сборки, создадим каталог в домашней директории:
mkdir ~/pi_cross/
Закидываем туда образ системы и можно в принципе его сразу примонтировать к себе, пригодится далее:
sudo mount -o loop,offset=70254592 ~/pi_cross/raspberry-embed.iso /mnt/rasp-pi-rootfs.
Для вычисления этого самого оффсета делаем:
elesar@elesar ~ $ fdisk -l ~/pi_cross/raspberry-embed.iso
Disk /home/elesar/pi_cross/raspberry-embed.iso: 16.0 GB, 16021192704 bytes
255 heads, 63 sectors/track, 1947 cylinders, total 31291392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb0358c95
Device Boot Start End Blocks Id System
/home/elesar/pi_cross/raspberry-embed.iso1 8192 137215 64512 c W95 FAT32 (LBA)
/home/elesar/pi_cross/raspberry-embed.iso2 137216 31291391 15577088 83 Linux
Смотрим на end второй части, и умножаем на размер сектора: 137216 * 512 = 70254592.
Следующим шагом мы скопируем исходники Qt:
git clone git://code.qt.io/qt/qt5.git
И, перейдя в свежескачанный каталог:
cd qt5
выполним:
./init-repository
для докачки требуемых субмодулей. Тут-то нам кофе и понадобится. У меня скачка заняла не менее получаса. Затем нам понадобится кроссплатформенный тулчейн. Его можно вытянуть отсюда:
wget https://www.dropbox.com/s/sl919ly0q79m1e6/gcc-4.7-linaro-rpi-gnueabihf.tbz
Распаковываем его в нашу папочку. Еще понадобится библиотечка:
sudo apt-get install ia32-libs
Но только если у вас 64 битная версия ОС. Теперь, когда все скачано, и новая порция кофе на подходе, можно запустить полезный скрипт из тулчейна:
sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/pi_cross/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc
Который настроит симлинки. Все, теперь можно приступать к сборке Qt. Идем к конфигуратору:
cd ~/pi_cross/qt5/qtbase
И выполняем:
./configure -qt-xcb -openssl -securetransport -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/pi_cross/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -qreal float -make libs -prefix /usr/local/qt5pi -hostprefix /usr/local/qt5pi
На что терминал дружелюбно ответит что-то вроде этого:
Перечисляя поддерживаемые опции. Собираем:
make -j 4
sudo make install
Это самый долгий этап. Моя машинка шуршала байтиками около часа. Все практически готово. Выхлопом сборки- установки является образ диска, который мы примонтировали загодя. Его нужно отмонтировать и залить на SD карточку, которую надо вставить в Малинку и можно включать. (фоточка раб.стола малинки).
После загрузки системы и небольшой конфигурации начинаем настраивать Creator. Для начала укажем ему qmake, что был собран, аки франкенштейн, в папку /usr/local/qt5pi/bin/qmake:
В качестве компилятора указываем gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc:
Создаем устройство, задаем ему пароль и адрес:
Создаем новый комплект с подобающим именем:
В sysroot указываем наш вновь примонтированный образ. Единственная загвоздка- это дебаггер. У меня наотрез отказался работать таковой от линаро, поэтому я подсунул GDB- Multi, который работает без нареканий. Все! Теперь при создании нового проекта, стал доступен новый комплект:
Для запуска и дебага непосредственно на устройстве необходимо добавить в .pro файл пару строчек:
target.path = /usr/bin
INSTALLS += target
TARGET = Name_On_Target
Они укажут путь, по которому установится приложение, и его имя.
В качестве заключения хочется отметить минус такого способа — при любых изменениях на таргете, например, установка новых библиотек, приходится снимать образ с SD карточки, дабы примонтировать его в качестве sysroot, иначе компилятор не будет о них знать. Спасибо за внимание, откланиваюсь. И да обойдут вас стороной эксепшены.
Комментарии (27)
vitaly_KF
22.10.2016 13:26Спасибо, нужно больше статей про Qt =)
PS: Месяца три назад заморочился со сборкой Qt прямо на CubieTruck, вместе с вебкитом собиралось двое суток)pistoletov
22.10.2016 17:45А кросс-компилятор под ALLWINER не удалось найти?
vitaly_KF
22.10.2016 17:46Мне спецом хотелось на кубике собрать Qt.
pistoletov
22.10.2016 17:53я год назад г на кубике первом игрался под эклипсом, помнится что тогда вроде не удалось найти кросс тулчейн…
EvilNW
22.10.2016 18:13Если программы маленькие, то Qt можно установить прям на Малинку.
Под Windows делал связку Rpi2 с установленным qt(версия 5.2 или 5.3. точно не помню) + Xming.
Только запускать надо без стартового окна Qt(qtcreator -noload Welcome)broomcode
22.10.2016 18:16Для небольших, безусловно можно, но когда проект разрастается- гораздо удобнее, а главное быстрее данный вариант.
sleeply4cat
22.10.2016 22:50А есть ли реальная возможность поставить на rpi3 чистый дебиан, без встроенного майнкрафта, левых репозиториев и непонятных версий пакетов?
vsapronov
23.10.2016 06:02Есть, мы так делаем в проекте Syncloud. Отрезаем boot от их Raspbiana и прикручиваем его к официальному debian arm. Делаем также еще для десятка разных плат, поскольку нам нужна стандартная одинаковая платформа на всех платах.
Могу направить в правильное место в скриптах в наших репозиториях.sleeply4cat
23.10.2016 11:00Где-то вот здеь? https://github.com/syncloud/image
Т.е. я могу просто не вызывать Merge, и получу чистый дебиан? ^_^vsapronov
24.10.2016 05:30Нет merge как раз вам нужен — это и есть merge boot c rootfs. Просто у нас rootfs нужный нам, а вы можете взять чистый. Чтобы понять, как из чистого мы получаем наш можно посмотреть на https://github.com/syncloud/image/blob/master/rootfs.sh
Вам там нужно extract.sh и потом merge.sh. При этом root fs, который используется в merge мы получаем из стандартного в rootfs.sh, вы можете закомментарить там почти все и получить чистый дебиан rootfs…
Если подождете пару дней, я даже могу поднять дополнительный билд конфигурации, которые вам соберут все автоматически.
Но если коротко ответить на ваш вопрос: то это, ох, как возможно!sleeply4cat
26.10.2016 21:50Было бы просто замечательно. Насколько я понимаю, драйвера видео можно будет установить из официальных PPA, раз ядро используется ванильное?
А можете дать последовательность команд сборки полной вашей системы? Я так и не нашёл, какие версии нужно указывать, чтобы rootfs с сервера выкачать.
А скрипты я смотрел и комментировал условно-ненужное. В итоге даже что-то частично загрузилось)
Была куча ошибок при сборке. Например, в архив rootfs пошли данные из /dev/zero, пришлось прервать и руками доделывать. В каком окружении вы запускаете?
stanr
23.10.2016 11:40Более того даже без иксов…
Называется оно RASPBIAN JESSIE LITE — в разделе загрузки на офф. сайте rpi.
Cthulhu34
23.10.2016 11:40вот это посмотрите
http://www.jumpnowtek.com/rpi/Raspberry-Pi-Systems-with-Yocto.htmlstanr
28.10.2016 23:43Наверно случайно забыл упомянуть, что yocto является частью boot to qt те мягко говоря не за бесплатно после триала ~30 дней? Бывает… ага.
Cthulhu34
29.10.2016 10:01+1Готовая сборка boot to qt коммерческая. Она работает «из коробки» и ничего колхозить самому не надо. И она базируется на yocto. Но yocto сама по себе бесплатна и не является часть qt. Вот https://www.yoctoproject.org/about
Prototik
23.10.2016 01:18Вместо шаманства с оффсетами образа всё-таки рекомендую перейти на использование losetup > partprobe > mount.
madrouter
23.10.2016 11:41> sudo mount -o loop,offset=70254592 ~/pi_cross/raspberry-embed.iso /mnt/rasp-pi-rootfs.
Ручное вычисление оффсетов может быть полезно для понимания. Но в обычных задачах лучше использовать kpartx ;)
sudo losetup -f
sudo losetup /dev/loop0 $HOME/pi_cross/raspberry-embed.iso
sudo kpartx -a /dev/loop0
sudo mount /dev/mapper/loop0p2 /mnt/rasp-pi-rootfs.
> wget https://www.dropbox.com[...]
> sudo ./fixQualifiedLibraryPaths
Кхм…
Спасибо, нет. Было бы интереснее узнать, как собрать этот toolchain или получить из доверенных источников
Pcholl
24.10.2016 12:45Это хорошо, что в Qt для pi3 есть свои нативные mkspecs. Для других миникомпов такой номер не прокатит. Например, пытаюсь собрать Qt для odroid c1+, по сути все аналогично, но конфигуратору вместо -device <..> надо передавать опцию -platform linux-g++ и вручную править файл qmake.conf в соответствующей папке ибо Qt не знает такого девайса
al_sh
24.10.2016 13:14Я вариант с Buldroot пользую. На выходе малюсенькая рутфс на systemd (Qt5.7+QML+QtWebEngine) без иксов с OpenGL ES 2.0 прямо через EGL(eglfs). Весит 300 Мб, грузится 4-5 сек.
shakespear
24.10.2016 13:54Добавлю для истории ссылку по на последний корректный мануал про кросскомпиляции и сборке Qt 5.x для RPi2
https://wiki.qt.io/RaspberryPi2EGLFS#Step_by_step
Проверено неделю назад, решение работоспособно. Особенности — используется rsync вместо маунта образа диска, что, при наличии прямой сети с малинкой, в разы ускоряет деплой и модулей Qt и, собственно, своих приложений.
Кто — то спрашивал про производительность:
- демо виджет OpenGL от разработчиков Qt отрабатывает на 60 fps без проблем.
- собственное приложение на виджетах + несколько фреймов на Qml с Osm картами — тормозов также не замечено.
stanr
28.10.2016 23:47Это то, откуда это мягко говоря было скопировано, без указания источников т копирайтов + кривой отсебятиной в виде монтирования флешек.
Даты постов решают все.
п.с. и да я запускал qt 5.7 как раз по мануалу с qt.io по eglfs примерно за 2 недели до этой публикации на ГТ.
MaxAlekseev
Статья очень полезная, но для полного счастья не хватает примера «Hello world!» на малине в QtCreator.
broomcode
Хорошо, есть материалл на вторую статью.