[Из песочницы] Знакомим QT с Raspberry Pi 3

Возникла однажды необходимость писать программы под малинку, именно используя замечательный фреймворк QT, со всеми удобствами его креатора. Данная статья — есть попытка структурировать знания по сборке библиотек и настройке среды для удобных компиляции и дебага прямо на железе.

image

  • Для начала что мы имеем:
  • Хост с установленным 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


На что терминал дружелюбно ответит что-то вроде этого:

image

Перечисляя поддерживаемые опции. Собираем:


make -j 4
sudo make install


Это самый долгий этап. Моя машинка шуршала байтиками около часа. Все практически готово. Выхлопом сборки- установки является образ диска, который мы примонтировали загодя. Его нужно отмонтировать и залить на SD карточку, которую надо вставить в Малинку и можно включать. (фоточка раб.стола малинки).

После загрузки системы и небольшой конфигурации начинаем настраивать Creator. Для начала укажем ему qmake, что был собран, аки франкенштейн, в папку /usr/local/qt5pi/bin/qmake:

image

В качестве компилятора указываем gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc:

image

Создаем устройство, задаем ему пароль и адрес:

image

Создаем новый комплект с подобающим именем:

image

В sysroot указываем наш вновь примонтированный образ. Единственная загвоздка- это дебаггер. У меня наотрез отказался работать таковой от линаро, поэтому я подсунул GDB- Multi, который работает без нареканий. Все! Теперь при создании нового проекта, стал доступен новый комплект:

image

Для запуска и дебага непосредственно на устройстве необходимо добавить в .pro файл пару строчек:

target.path = /usr/bin
INSTALLS += target
TARGET = Name_On_Target


Они укажут путь, по которому установится приложение, и его имя.

В качестве заключения хочется отметить минус такого способа — при любых изменениях на таргете, например, установка новых библиотек, приходится снимать образ с SD карточки, дабы примонтировать его в качестве sysroot, иначе компилятор не будет о них знать. Спасибо за внимание, откланиваюсь. И да обойдут вас стороной эксепшены.

© Geektimes