Возникла однажды необходимость писать программы под малинку, именно используя замечательный фреймворк 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, иначе компилятор не будет о них знать. Спасибо за внимание, откланиваюсь. И да обойдут вас стороной эксепшены.
Поделиться с друзьями
-->

Комментарии (27)


  1. MaxAlekseev
    22.10.2016 13:23
    +2

    Статья очень полезная, но для полного счастья не хватает примера «Hello world!» на малине в QtCreator.


    1. broomcode
      22.10.2016 14:39
      +1

      Хорошо, есть материалл на вторую статью.


  1. vitaly_KF
    22.10.2016 13:26

    Спасибо, нужно больше статей про Qt =)

    PS: Месяца три назад заморочился со сборкой Qt прямо на CubieTruck, вместе с вебкитом собиралось двое суток)


    1. pistoletov
      22.10.2016 17:45

      А кросс-компилятор под ALLWINER не удалось найти?


      1. vitaly_KF
        22.10.2016 17:46

        Мне спецом хотелось на кубике собрать Qt.


        1. pistoletov
          22.10.2016 17:53

          я год назад г на кубике первом игрался под эклипсом, помнится что тогда вроде не удалось найти кросс тулчейн…


  1. EvilNW
    22.10.2016 18:13

    Если программы маленькие, то Qt можно установить прям на Малинку.
    Под Windows делал связку Rpi2 с установленным qt(версия 5.2 или 5.3. точно не помню) + Xming.
    Только запускать надо без стартового окна Qt(qtcreator -noload Welcome)


    1. broomcode
      22.10.2016 18:16

      Для небольших, безусловно можно, но когда проект разрастается- гораздо удобнее, а главное быстрее данный вариант.


  1. ser-mk
    22.10.2016 18:13

    что бы каждый раз не дампить карту, можно воспользоваться nfs.
    Монтируешь по ней Rootfs c хоста, и вот тебе на блюдечке sysroot (=


    1. broomcode
      22.10.2016 18:14

      Периодически возникают ситуации, что платки нет в зоне доступа, тогда образ спасает.


  1. sleeply4cat
    22.10.2016 22:50

    А есть ли реальная возможность поставить на rpi3 чистый дебиан, без встроенного майнкрафта, левых репозиториев и непонятных версий пакетов?


    1. vsapronov
      23.10.2016 06:02

      Есть, мы так делаем в проекте Syncloud. Отрезаем boot от их Raspbiana и прикручиваем его к официальному debian arm. Делаем также еще для десятка разных плат, поскольку нам нужна стандартная одинаковая платформа на всех платах.
      Могу направить в правильное место в скриптах в наших репозиториях.


      1. sleeply4cat
        23.10.2016 11:00

        Где-то вот здеь? https://github.com/syncloud/image
        Т.е. я могу просто не вызывать Merge, и получу чистый дебиан? ^_^


        1. 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…
          Если подождете пару дней, я даже могу поднять дополнительный билд конфигурации, которые вам соберут все автоматически.

          Но если коротко ответить на ваш вопрос: то это, ох, как возможно!


          1. sleeply4cat
            26.10.2016 21:50

            Было бы просто замечательно. Насколько я понимаю, драйвера видео можно будет установить из официальных PPA, раз ядро используется ванильное?

            А можете дать последовательность команд сборки полной вашей системы? Я так и не нашёл, какие версии нужно указывать, чтобы rootfs с сервера выкачать.

            А скрипты я смотрел и комментировал условно-ненужное. В итоге даже что-то частично загрузилось)
            Была куча ошибок при сборке. Например, в архив rootfs пошли данные из /dev/zero, пришлось прервать и руками доделывать. В каком окружении вы запускаете?


    1. stanr
      23.10.2016 11:40

      Более того даже без иксов…
      Называется оно RASPBIAN JESSIE LITE — в разделе загрузки на офф. сайте rpi.


    1. Cthulhu34
      23.10.2016 11:40

      вот это посмотрите
      http://www.jumpnowtek.com/rpi/Raspberry-Pi-Systems-with-Yocto.html


      1. sleeply4cat
        23.10.2016 12:14

        Спасибо, попробую, если не заведётся вариант Syncloud'a.


      1. stanr
        28.10.2016 23:43

        Наверно случайно забыл упомянуть, что yocto является частью boot to qt те мягко говоря не за бесплатно после триала ~30 дней? Бывает… ага.


        1. Cthulhu34
          29.10.2016 10:01
          +1

          Готовая сборка boot to qt коммерческая. Она работает «из коробки» и ничего колхозить самому не надо. И она базируется на yocto. Но yocto сама по себе бесплатна и не является часть qt. Вот https://www.yoctoproject.org/about


  1. Prototik
    23.10.2016 01:18

    Вместо шаманства с оффсетами образа всё-таки рекомендую перейти на использование losetup > partprobe > mount.


  1. tzlom
    23.10.2016 05:45

    QML работает? как с производительностью?


  1. 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 или получить из доверенных источников


  1. Pcholl
    24.10.2016 12:45

    Это хорошо, что в Qt для pi3 есть свои нативные mkspecs. Для других миникомпов такой номер не прокатит. Например, пытаюсь собрать Qt для odroid c1+, по сути все аналогично, но конфигуратору вместо -device <..> надо передавать опцию -platform linux-g++ и вручную править файл qmake.conf в соответствующей папке ибо Qt не знает такого девайса


  1. al_sh
    24.10.2016 13:14

    Я вариант с Buldroot пользую. На выходе малюсенькая рутфс на systemd (Qt5.7+QML+QtWebEngine) без иксов с OpenGL ES 2.0 прямо через EGL(eglfs). Весит 300 Мб, грузится 4-5 сек.


  1. 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 картами — тормозов также не замечено.


    1. stanr
      28.10.2016 23:47

      Это то, откуда это мягко говоря было скопировано, без указания источников т копирайтов + кривой отсебятиной в виде монтирования флешек.
      Даты постов решают все.

      п.с. и да я запускал qt 5.7 как раз по мануалу с qt.io по eglfs примерно за 2 недели до этой публикации на ГТ.