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
55 комментариев
старее
новее большинство голосов
Inline Feedbacks
View all comments
Алексей
Алексей
11 месяцев назад

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

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

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

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

Собирал 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

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

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

Здравствуйте!
У меня выходит ошибка на шаге 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  Дмитрий
7 месяцев назад

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

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

Спасибо

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

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

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

Здравствуйте! после выполнения этой команды
./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.

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

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

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

Камрады! Помогите, плиз! На 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
4 месяцев назад

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

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

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

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

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

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

Здравствуйте! Когда пытаюсь запустить тестовое приложение из гайда 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
4 месяцев назад

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

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

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

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

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

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

Неа =), У меня получилось нормально всё собрать только на старой 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 3 месяцев назад by Yuriy
Yuriy
Yuriy
Reply to  Yuriy
1 месяц назад

Прописать в переменные

QT_QPA_PLATFOMRTHEME=qt5ct
DISPLAY=:0.0
XAUTHORITY=/home/pi/.Xauthrity
XDG_SESSION_TYPE=x11

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

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

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

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

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

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

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

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

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

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

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

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

Не долго радовался.
Опять как и раньше (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 2 месяцев назад by Александр
Александр
Александр
Reply to  Александр
2 месяцев назад

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

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

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

Yuriy
Yuriy
1 месяц назад

При сообщение
Picking ‘qtbase-opensource-src’ as source package instead of ‘libqt5gui5’
Это
sudo apt-get build-dep qt4-x11 libqt5gui5
заминить на это
sudo apt-get build-dep -y qt4-x11 qtbase-opensource-src

Yuriy
Yuriy
1 месяц назад

Добрый день. У меня теперь вот такая проблема. В консоль при развёртывание выводит. Можете подсказать?

12:48:43: Запускается /home/pi/RaspDemo/RaspDemo …
12:48:44: Внешний процесс аварийно завершился.

12:48:43: Этап развёртывания завершён.
12:48:43: Прошло времени: 00:04.

/opt/qt5pi/sysroot/usr/local/qt5pi/qml/QtQuick.2/plugins.qmltypes:11:9: Ожидаются только связки со скриптами name, prototype, defaultProperty, attachedType, exports, isSingleton, isCreatable, isComposite и exportMetaObjectRevisions, но не «file».

Возникли следующие предупреждения при разборе информации о типах QML библиотеки /opt/qt5pi/sysroot/usr/local/qt5pi/qml/Qt/labs/animation:
/opt/qt5pi/sysroot/usr/local/qt5pi/qml/Qt/labs/animation/plugins.qmltypes:11:9: Ожидаются только связки со скриптами name, prototype, defaultProperty, attachedType, exports, isSingleton, isCreatable, isComposite и exportMetaObjectRevisions, но не «file».

Снимок.JPG
Yuriy
Yuriy
Reply to  Aveal
1 месяц назад

Могу, но он пустой. Создаю «Приложение QT Quick-Пустое» и попробовал развернуть. Если создают Проект без QT пишет нет команд для запуска.

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

Я помню что была команда, которая говорит какие пакеты нужны для запуска, можете её подсказать?

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

И сама малина пишет «недопустимая инструкция»

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

Тоже выводит «недопустимая инструкция», даже если пример из qtbase пробую,причём из консоли компилирую, ещё до установки QTCreater.

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

Он только эту фразу выводит.
Если через file написано, что для ARM, EABI5.
А вообще да, как будто проц не тот.

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

Переделал всё с нуля
на rpi2b

QT 5.12.3

./configure -release -opengl es2 -device inux-rasp-pi2-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v -no-use-gold-linker

и получил
pi@raspberrypi:~ $ ./qopenglwidget
Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).
EGL Error : Could not create the egl surface: error = 0x3003

Yuriy
Yuriy
Reply to  Aveal
26 дней назад

В общем я понял в чём проблема, для Rpi0/1 на arm6 надо использовать старый тулчэйн, новый делает под arm7 даже, если его просят другое. Осталось два открытых вопроса, почему вылезает 300b ошибка, нельзя создать поверхность, в примере qopenglwidget и почему когда нет рабочего стола ошибка, нет egl дисплея. С рабочем столом пустые окошки открываются =). Эх, хоть какой-то результат

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