[Из песочницы] Знакомим QT с Raspberry Pi 3
Возникла однажды необходимость писать программы под малинку, именно используя замечательный фреймворк QT, со всеми удобствами его креатора. Данная статья — есть попытка структурировать знания по сборке библиотек и настройке среды для удобных компиляции и дебага прямо на железе.
- Для начала что мы имеем:
- Хост с установленным 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, иначе компилятор не будет о них знать. Спасибо за внимание, откланиваюсь. И да обойдут вас стороной эксепшены.