Top.Mail.Ru

Raspberry Pi и Qt. Кросс-компиляция Qt и установка Qt Creator.

Одним из инструментов для создания приложений с графическим пользовательским интерфейсом является хорошо известный фреймворк Qt. Кроссплатформенность Qt позволяет нам успешно использовать его в том числе и для разработки на Raspberry Pi. Но здесь есть один нюанс, о котором мы и поговорим в этой статье.

В принципе, можно без проблем установить Qt Creator и сопутствующие библиотеки непосредственно на Raspberry. И, соответственно, на самой же плате и заниматься разработкой. Но! Компиляция требует достаточно серьезных мощностей, в связи с чем этот процесс на Raspberry будет занимать довольно продолжительное время, что, естественно, нежелательно.

Решение данной проблемы такое — разработка и дальнейшая компиляция выполняются на ПК, а уже готовое приложение загружается и используется на Raspberry Pi. Для реализации этого нам нужно будет кросс-компилировать Qt на хост-компьютере, чтобы затем можно было разворачивать и отлаживать приложения уже на плате. Итак, в отправной точке у нас в наличии:

Qt на Raspberry Pi
  • Raspberry Pi 4 с установленной Raspberry Pi OS.
  • Хост — ПК с ОС Ubuntu 20.04.
  • Подключение по SSH.

В дальнейшем часть команд будут выполняться на ПК, а часть — на Raspberry Pi, поэтому во избежание путаницы для каждой команды и каждого шага будем добавлять наглядные метки: [PC] или [Raspberry Pi].

Кросс-компиляция Qt.

Шаг 1. [Raspberry Pi]

Произведем необходимые настройки:

sudo raspi-config

Первым делом, включаем поддержку OpenGL driver with fake KMS. Для этого переходим в Advanced Options — GL Driver:

OpenGL driver with fake KMS

И второй момент — настраиваем Raspberry Pi OS на загрузку без запуска графической оболочки. Идем в System Options — Boot / Auto Login:

Raspberry Pi boot settings

Шаг 2. [Raspberry Pi]

Редактируем файл /etc/apt/sources.list, например, при помощи редактора nano:

sudo nano /etc/apt/sources.list

Нашей целью здесь является раскомментирование строки:

deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

Шаг 3. [Raspberry Pi]

Обновляем систему и устанавливаем необходимые библиотеки:

sudo apt-get update 
sudo apt-get upgrade

sudo apt-get build-dep qt5-qmake
sudo apt-get build-dep libqt5gui5
sudo apt-get build-dep libqt5webengine-data
sudo apt-get build-dep libqt5webkit5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver pkg-config mesa-utils libgles2-mesa-dev libdrm.dev libgbm.dev

Шаг 4. [Raspberry Pi]

Создаем на Raspberry Pi папку для пользователя pi для дальнейшего развертывания в ней Qt:

sudo mkdir /usr/local/qt
sudo chown pi:pi /usr/local/qt

Шаг 5. [PC]

Теперь создаем папку на хосте и скачиваем тулчейн для кросс-компиляции:

mkdir ~/raspberrypi
cd ~/raspberrypi
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

У меня 64-битная ОС, соответственно, версия — x86_64.

Шаг 6. [PC]

Создаем sysroot для кросс-компиляции под Raspberry Pi:

mkdir sysroot sysroot/usr sysroot/opt

Шаг 7. [PC]

Синхронизируем sysroot на ПК с Raspberry Pi:

rsync -avz pi@192.168.0.101:/lib sysroot
rsync -avz pi@192.168.0.101:/usr/include sysroot/usr
rsync -avz pi@192.168.0.101:/usr/lib sysroot/usr
rsync -avz pi@192.168.0.101:/opt/vc sysroot/opt

Соответственно, здесь и далее имя пользователя (pi) и ip-адрес платы (192.168.0.101) нужно заменить на свои.

Шаг 8. [PC]

Заменяем символьные ссылки sysroot на относительные при помощи готового скрипта sysroot-relativelinks.py. Скачиваем скрипт и запускаем:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Шаг 9. [PC]

Скачиваем исходники Qt. Будем использовать LTS версию 5.15.1:

git clone git://code.qt.io/qt/qtbase.git -b 5.15.1
cd qtbase

Шаг 10. [PC]

Выполняем конфигурацию перед сборкой. Для Raspberry Pi 4 аргументом -device будет linux-rasp-pi4-v3d-g++:

./configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspberrypi/sysroot -prefix /usr/local/qt -extprefix ~/raspberrypi/qt -hostprefix ~/raspberrypi/host-qt -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

При успешном выполнении данного шага в консоли должны быть активированы следующие пункты:

Qt config output

При неудавшейся конфигурации или сборке не забываем выполнить полную очистку перед повторной попыткой:

git clean -dfx

Шаг 11. [PC]

Приготовления закончены, собираем:

make -j8
make install

Шаг 12. [PC]

Разворачиваем собранный Qt на Raspberry Pi:

cd ~/raspberrypi
rsync -avz qt pi@192.168.0.101:/usr/local

И на этом процесс завершен! Переходим к следующему аспекту — установке, запуску и настройке Qt Creator.

Qt Creator для Raspberry Pi.

Шаг 1. [PC]

Установка проста:

sudo apt install qtcreator

Шаг 2. [PC]

Добавляем устройство в Qt Creator. Переходим в меню Tools — Options, открываем раздел Devices и добавляем Generic Linux Device:

Qt Creator Devices

Здесь мы задали имя устройства, ip-адрес и имя пользователя. Кроме того, указываем приватный SSH-ключ для доступа к Raspberry Pi по SSH.

Шаг 3. [PC]

Идем в раздел Kits на вкладку Compilers и добавляем компиляторы для C и C++:

Qt Creator Raspberry Pi C compiler
Qt Creator Raspberry Pi C++ compiler

Шаг 4. [PC]

В том же разделе на вкладке Debuggers добавляем отладчик для работы с Raspberry. Но для этого предварительно устанавливаем:

sudo apt-get install gdb-multiarch

А затем уже возвращаемся в Debuggers:

Raspberry Pi GDB debugger

Шаг 5. [PC]

Дальше по списку вкладка Qt Versions, где мы добавляем версию Qt:

Qt versions

Шаг 6. [PC]

И финишируем на вкладке Kits, добавив набор инструментов, которые мы будем использовать для Raspberry Pi. Собственно, систематизируем все, что мы добавили ранее:

Raspberry Pi Qt Kit

Теперь при создании нового проекта будет доступен созданный набор, названный нами — Raspberry Pi. В общем-то, как раз и переходим к созданию тестового проекта.

Создание проекта.

Шаг 1. [PC]

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

Создание нового проекта для Raspberry Pi

Шаг 2. [PC]

В настройках проекта в .pro файле можно задать путь для установки приложения на Raspberry Pi. К примеру:

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /home/pi/Qt_Projects/$${TARGET}
!isEmpty(target.path): INSTALLS += target

То есть в данном случае созданное приложение будет развернуто в папке /home/pi/Qt_Projects/ на Raspberry Pi.

Шаг 3. [PC]

Создаем простейшее приложение с одной кнопкой. По нажатию кнопки, а также в конструкторе и деструкторе MainWindow выдаем сообщение через qDebug().

Собираем приложение и разворачиваем на Raspberry Pi:

Qt, тестовый проект

Итогом будет успешный запуск на Raspberry:

Qt на Raspberry Pi

Собственно, цель достигнута!

В завершение, разберем одну потенциальную проблему. При компиляции тестового проекта могут возникнуть ошибки вроде:

error: variable has incomplete type 'QApplication'
error: unknown type name 'MainWindow'

Часто это связано с тем, что Ubuntu 20.04 по умолчанию использует clang-10. А Qt требует clang-8. Поэтому для устранения ошибок выполняем последовательно:

sudo apt install clang-8
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100

Вот на этом точно все, спасибо за внимание и до скорого!

Подписаться
Уведомление о
guest
40 комментариев
старее
новее большинство голосов
Inline Feedbacks
View all comments
Алексей
Алексей
9 месяцев назад

Здравствуйте! Можно уточнить шаг 10 для pi3?

Алексей
Алексей
Reply to  Aveal
9 месяцев назад

О! Спасибо, попробую.

Артем
Артем
9 месяцев назад

Собирал Qt 15.1 для rpi4, никак не конфигурировадись GBM и EGLDevice. Решилось добавлением:
sudo apt-get install mesa-utils
sudo apt-get install libgles2-mesa-dev
sudo apt-get install libdrm.dev
sudo apt-get install libgbm.dev

И синхронизация затем

Дмитрий
Дмитрий
8 месяцев назад

Здравствуйте!
У меня выходит ошибка на шаге 10.
Project ERROR: Cannot run target compiler ‘/home/pi/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++’. Output:
===================
===================
Maybe you forgot to setup the environment?

Но он у меня установлен. В Чём может быть дело? git clean -dfx не помогает.
Буду очень признателен за помощь!

Артем
Артем
Reply to  Дмитрий
5 месяцев назад

Проверь путь.
./configure … ~/raspberrypi

Павел
Павел
7 месяцев назад

Спасибо

Артем
Артем
5 месяцев назад

Project ERROR: Unknown module(s) in QT: quick
что делать?

Вячеслав
Вячеслав
5 месяцев назад

Здравствуйте! после выполнения этой команды
./configure -release -opengl es2 -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/raspberrypi/gcc-linaro-7.5.02019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspberrypi/sysroot -prefix /usr/local/qt -extprefix ~/raspberrypi/qt -hostprefix ~/raspberrypi/host-qt -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

выходит вот такой вот результат.. Что я делаю не так? подскажите пожалуйста?!

Note: Also available for Linux: linux-clang linux-icc

Note: PKG_CONFIG_LIBDIR automatically set to /home/slk/raspberrypi/sysroot/usr/lib/pkgconfig:/home/slk/raspberrypi/sysroot/usr/share/pkgconfig:/home/slk/raspberrypi/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig

Note: PKG_CONFIG_SYSROOT_DIR automatically set to /home/slk/raspberrypi/sysroot

WARNING: Command line option -skip is only effective in top-level builds.

ERROR: Feature ‘opengles2’ was enabled, but the pre-condition ‘(config.win32 && !features.opengl-dynamic) || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)’ failed.

ERROR: Feature ‘eglfs’ was enabled, but the pre-condition ‘!config.android && !config.darwin && !config.win32 && !config.wasm && features.egl’ failed.

ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.

Павел
Павел
4 месяцев назад

На дворе середина мая 21-го. А новых статей нету((( Это связано с большой загруженностью автора или маленьким количеством посетителей сайта?

Александр
Александр
2 месяцев назад

Камрады! Помогите, плиз! На 10-м шаге:

   EGLFS EGLDevice …………………. no
   EGLFS GBM ………………………. no

кроме того вот такое после отработки:

Note: Also available for Linux: linux-clang linux-icc
Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing.
WARNING: Command line option -skip is only effective in top-level builds.
ERROR: Feature ‘pkg-config’ was enabled, but the pre-condition ‘tests.pkg-config’ failed.

До 10-го шага дошел только после отработки рекомендации Артема (спасибо): https://microtechnics.ru/raspberry-pi-i-qt-kross-kompilyacziya-qt-i-ustanovka-qt-creator/#comment-79251
Без этого не проходила синхронизация по трем пунктам:

rsync -avz pi@192.168.0.101:/usr/include sysroot/usr
rsync -avz pi@192.168.0.101:/usr/lib sysroot/usr
rsync -avz pi@192.168.0.101:/opt/vc sysroot/opt

Ну очень хочется QT!

Да! На компе QT ставлю на виртуальную машину UBUNTU 4.15.0-147-generic #151 64 bit

Александр
Александр
Reply to  Aveal
2 месяцев назад

Айййй-яййй! Спасибо, золотой! Успех!

Александр
Александр
2 месяцев назад

Добрые утро, день, вечер! Еще вопросик. Можно ли сделать так, чтобы окно отлаживаемой программы выводилось на экран компа на котором работает QT, а не на монитор, подключенный к малинке?

Last edited 2 месяцев назад by Александр
Александр
Александр
Reply to  Aveal
2 месяцев назад

У меня проект завязан на железо Raspberry (GPIO, SPI и пр.). Полную отладку на хосте не сделать.

Yuriy
Yuriy
2 месяцев назад

Здравствуйте! Когда пытаюсь запустить тестовое приложение из гайда RaspberryPi2EGLFS с qt.wiki получаю такое сообщение QXcbConnection: Could not connect to display, на форуме qt есть такая ошибка и говорять «you can link with rpath (does require recompilation).«, но я не понимаю о чём они. А если из QTCreator вижу сообщение, что mkdir не может быть выполнен нет прав. Можете помочь?

Yuriy
Yuriy
Reply to  Aveal
2 месяцев назад

Тоже самое.
Пробовал ./qopenglwidget -platform eglfs получил * failed to add service — already in use?
Если ввожу в MobaXterm под windows программа открывается на стационаре.

Yuriy
Yuriy
Reply to  Aveal
2 месяцев назад

Нет консоль. Но если я не правильно понял, как это посмотреть? Я сильно начинающий, могу говорит глупости =)

Yuriy
Yuriy
Reply to  Aveal
2 месяцев назад

Нет, консоль, как у вас в первом шаге

Last edited 2 месяцев назад by Yuriy
Yuriy
Yuriy
Reply to  Aveal
2 месяцев назад

Неа =), У меня получилось нормально всё собрать только на старой ubuntu 32bit и образом на малину 2017 года и QT 5.9. Это всё на Rasperry pi zero w.
Некоторые версии не хотя конфигурироваться 5.10 и 5.11, 5.15 не захотела собраться, сказала что её нужен С++11, хотя я вроде его подключал. 5.12 собралась, но вот с траблами. Пересобрал с другим образам Rasp оно говорит, что нет xcd, переключиться на платформу через -platforms EGLFS, он всёравно говорит что нет xcd.

Last edited 2 месяцев назад by Yuriy
Александр
Александр
19 дней назад

Устал! Братцы, помогите!
Все было настроено и худо-бедно работало. Писал, компилил, отлаживал нормально. Потом на долгое время «отошел от дел», где-то с месяц даже ubuntu ни разу не запустил. Сегодня попытался возобновить работу. Ни один проект не компилится, в настройках QT ошибки повылазили. После нескольких часов «битвы за правду» решил с нуля поставить новую виртуалку ubunt-ы с того же дистрибутива с которого до этого ставил, поставил. Начал ставить QT на нее, но на шаге 8 команда ./sysroot-relativelinks.py sysroot вылетает с ошибкой /usr/bin/env: ‘python’: No such file or directory
Когда ставил первый раз — в этом месте вообще ни каких проблем не было.
ЗЫ
Сейчас посмотрел файла env в папке /usr/bin нету. Ну не копировать же его с первой ubuntы?

Last edited 19 дней назад by Александр
Александр
Александр
Reply to  Александр
19 дней назад

Прошу прощения! файл /usr/bin/env — имеется в наличии

Александр
Александр
Reply to  Aveal
18 дней назад

Спасибо за подсказку!
Попробовал.
Reading package lists… Done
Building dependency tree      
Reading state information… Done
E: Unable to locate package python-is-python3

Буду снова переустанавливать ubuntu, возможно при установке что-то сбойнуло.

Александр
Александр
Reply to  Aveal
17 дней назад

только-что обновил до 20.04.3 — та же песня.
Завтра снесу и поставлю заново.

Александр
Александр
Reply to  Aveal
17 дней назад

Ай спасибо, уважаемый! Все пошлО!

Александр
Александр
Reply to  Aveal
17 дней назад

Не долго радовался.
Опять как и раньше (https://microtechnics.ru/raspberry-pi-i-qt-kross-kompilyacziya-qt-i-ustanovka-qt-creator/#comment-79380) на 10-м шаге проблема, но немного другая:
QPA backends:
 DirectFB …………………………. no
 EGLFS ……………………………. no
Соответственно раздела EGLFS details в отчете вообще нет.
И сообщение об ошибке уже другое:
Note: Also available for Linux: linux-clang linux-icc

WARNING: Command line option -skip is only effective in top-level builds.

ERROR: Feature ‘eglfs’ was enabled, but the pre-condition ‘!config.android && !config.darwin && !config.win32 && !config.wasm && features.egl’ failed.
Тупо попробовал по образу и подобию Вашей подсказки для предыдущего случая сделать: sudo apt-get install eglfs. Однако халявы не вышло:
Reading package lists… Done
Building dependency tree      
Reading state information… Done
E: Unable to locate package eglfs
q@ubuntu:~/qtbase$
Тяжко быть дремучим.:(
Не долго радовался.
Опять как и раньше (https://microtechnics.ru/raspberry-pi-i-qt-kross-kompilyacziya-qt-i-ustanovka-qt-creator/#comment-79380) на 10-м шаге проблема, но немного другая:
QPA backends:
 DirectFB …………………………. no
 EGLFS ……………………………. no
Соответственно раздела EGLFS details в отчете вообще нет.
И сообщение об ошибке уже другое:
Note: Also available for Linux: linux-clang linux-icc

WARNING: Command line option -skip is only effective in top-level builds.

ERROR: Feature ‘eglfs’ was enabled, but the pre-condition ‘!config.android && !config.darwin && !config.win32 && !config.wasm && features.egl’ failed.
Тупо попробовал по образу и подобию Вашей подсказки для предыдущего случая сделать: sudo apt-get install eglfs. Однако халявы не вышло:
Reading package lists… Done
Building dependency tree      
Reading state information… Done
E: Unable to locate package eglfs
q@ubuntu:~/qtbase$

git clean -dfx делал
Тяжко быть дремучим.:(

Last edited 17 дней назад by Александр
Александр
Александр
Reply to  Александр
17 дней назад

Тааак, похоже я прозевал, что у меня синхронизация на шаге 7 не вся прошла.

Александр
Александр
Reply to  Александр
17 дней назад

Ура! После манипуляций по рекомендации Артема https://microtechnics.ru/raspberry-pi-i-qt-kross-kompilyacziya-qt-i-ustanovka-qt-creator/#comment-79251 (второй раз ему спасибо!) и повторения синхронизации 10-й шаг прошел как надо!

40
0
Would love your thoughts, please comment.x
()
x