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

112 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Алексей
Алексей
3 лет назад

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

Алексей
Алексей
Ответ на комментарий  Aveal
3 лет назад

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

Артем
Артем
3 лет назад

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

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

Дмитрий
Дмитрий
3 лет назад

Здравствуйте!
У меня выходит ошибка на шаге 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 не помогает.
Буду очень признателен за помощь!

Артем
Артем
Ответ на комментарий  Дмитрий
3 лет назад

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

Павел
Павел
3 лет назад

Спасибо

Артем
Артем
3 лет назад

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

Вячеслав
Вячеслав
3 лет назад

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

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

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.

Павел
Павел
2 лет назад

На дворе середина мая 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

Александр
Александр
Ответ на комментарий  Aveal
2 лет назад

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

Александр
Александр
2 лет назад

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

Александр
Александр
Ответ на комментарий  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
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  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.

Yuriy
Yuriy
Ответ на комментарий  Yuriy
2 лет назад

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

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ы?

Александр
Александр
Ответ на комментарий  Александр
2 лет назад

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

Александр
Александр
Ответ на комментарий  Aveal
2 лет назад

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

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

Александр
Александр
Ответ на комментарий  Aveal
2 лет назад

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

Александр
Александр
Ответ на комментарий  Aveal
2 лет назад

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

Александр
Александр
Ответ на комментарий  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 делал
Тяжко быть дремучим.:(

Александр
Александр
Ответ на комментарий  Александр
2 лет назад

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

Александр
Александр
Ответ на комментарий  Александр
2 лет назад

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

Yuriy
Yuriy
2 лет назад

При сообщение
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
2 лет назад

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

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
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

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

Yuriy
Yuriy
Ответ на комментарий  Aveal
2 лет назад

Переделал всё с нуля
на 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
Ответ на комментарий  Aveal
2 лет назад

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

Dean_l
Dean_l
2 лет назад

Добрый день. Подскажите как узнать какие устройства поддерживает qt на 10 шаге :
-device linux-rasp-pi4-v3d-g++. Мне необходимо совершенно другое устройство - orange pi pc 2, но как правильно указать его я не знаю. Компилятор подходящий.

Dean_l
Dean_l
Ответ на комментарий  Aveal
2 лет назад

Разобрался где расположены - qtbase/mkspcecs
Вот только при сборке ругается на отсутствие crt1.o и crti.o

Dean_l
Dean_l
Ответ на комментарий  Dean_l
2 лет назад

кстати, linux-rasp-pi3-vc4-g++ должно подойди под orange pi pc2(arm cortexA53). Осталось только разобраться с crt1.0 и crti.o

сергей
сергей
Ответ на комментарий  Dean_l
2 лет назад

cannot find crt1.o: - победили?
cannot find -lm - пока не понял в чем дело.

Dean_l
Dean_l
Ответ на комментарий  Aveal
2 лет назад

Да с этим справился. Надо не забывать чистить в случае не удачной сборки

Dean_l
Dean_l
Ответ на комментарий  Aveal
2 лет назад

а нет, не справился. Даже прилинковка не помогла - https://stackoverflow.com/questions/6329887/compiling-problems-cannot-find-crt1-o

Алексей
Алексей
Ответ на комментарий  Dean_l
2 лет назад

у меня тоже ошибка cannot find crti.o вы как-то победили её ?

Алексей
Алексей
2 лет назад

Добрый день!
Выполнил все пункты, всё работает, но есть одно "НО".
Для моего проекта на Pi4 нужно работать с камерой и подключенным по USB устройством. Для этого я обычно пользуюсь QCamera (из модуля QtMultimedia) и QtSerialPort. Но эти два модуля не входят в qtbase, который в статье рекомендуется качать с GITa. Соответственно, у меня есть 2 пути:

  1. Скачать исходники полной версии Qt, сконфигурировать и собрать ее нужным образом.
  2. Скачать отдельно модули и собрать их в качестве библиотек для подключения к проекту.

И я в обоих случаях сталкиваюсь с проблемами.
В первом варианте не могу нормально прописать команду конфигурации. Файлы конфигурации для qtbase и полной версии qt различаются, описанная в статье команда не подходит, все мои попытки написать свой вариант не привели к успеху.
Во втором варианте я пока не очень понял, как собрать библиотеки именно так, чтобы их подключить к рабочей версии qt, которая уже сейчас позволяет простейший код на raspberry выводить.
Буду рад любой помощи!

Алексей
Алексей
Ответ на комментарий  Aveal
2 лет назад

Буду сражаться сам и ждать статью.
спасибо)

Алексей
Алексей
Ответ на комментарий  Aveal
2 лет назад

Снова здравствуйте!
У меня получилось решить проблему.
Всего то нужно было вместо qtbase скачать репозиторий с qt5, но обязательно ветку 5.15.1 - только с ней работает описанная в статье команда конфигурации (возможно, с какими-то еще работает, но если ветку не указать в команде клонирования, ничего не получится).
Итого для тех, кому нужно будет, набор команд:

git clone git://code.qt.io/qt/qt5.git -b 5.15.1
cd qt5
perl init-repository --module-subset=default,-qtwebengine

Опция в последней команде позволяет не инициализировать "тяжелый" qtwebengine.
Фактически это то, чем нужно заменить 9 пункт в статье, и всё будет работать.
Причём можно выполнить эти команды даже "поверх" всех манипуляций, описанных в статье. Нужно будет только повторить пункты с 10 до 12.

Что касается того, как установить именно внешнюю библиотеку, решения я так и не нашел. Проект со скомпилированной библиотекой вроде как даже собирается в QtCreator, но при попытке запуска приложения (оно же развертывание на "малинке") появляется ошибка о невозможности найти файл библиотеки.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

А какой вы подключили qmake из qt5 ?

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Подключение qmake описано выше в статье в разделе "Qt Creator для Raspberry Pi".Всё делал так, как здесь, и всё работает, так что спасибо автору.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

В статье выше очень плохое качество снимка. Можете дать путь к qmake в вашем случаи. Когда у вас все работает.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Не знаю, что не так у Вас с качеством снимка - я прекрасно могу прочитать, картинка к пункту 5 настройки Qt:
/home/pc_name/raspberrypi/host-qt/bin/qmake
Свои пути сейчас скопировать не могу, но они аналогичны

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

А у вас qserialPort работает? У меня не хочет выдает сообщение
Сигнал: 
SIGSEGV
Назначение: 
Segmentation fault

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

да, с QSerialPort всё хорошо.
Segmentation fault - Ошибка слишком обширная, чтобы я мог как-то помочь с тем, что не так. Если Qt библиотеку видит, проблемы явно не в сборке. Смотрите свой код.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Можно выслать тебе проект на посмотреть ?

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Выслать то можно, но я не знаю, когда смогу посмотреть. Deadline по паре проектов близится, так что сейчас достаточно загружен, поэтому обещать не могу, что быстро совет дам какой-то.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Там в проекте не чего кроме qserialPort нет.
https://disk.yandex.ru/d/h2MJ2yVVIoRX0A

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

можно подробнее об ошибке?
На каком этапе возникает?
Этап компиляции или исполнения?
Сам проект собирается без ошибок?
Пробовали ли отладчиком искать, где проблема?

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Проект собирается без ошибок. Запускается и падает на строчки serial->write("hello");

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Если удалить строчку serial->write("hello"); то все работает.

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

уверены ли Вы, что "/dev/ttyS0" - это нужное устройство?
Судя по тому, что написано у Вас в коде, порт открывается и в debug выводится "true"?
Я бы использовал что-то вроде этого:

if(m_serialPort->open(QIODevice::ReadWrite)){
        m_connectionState = true;
        connect(m_serialPort, SIGNAL (readyRead()),  SLOT(recieveSerialPortAnswer()));
      }else{
          m_connectionState = false;
      }

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

serial->write("hello"); 

из конструктора. Возможно, порт не успевает законнектиться, и Вы сразу шлёте ему "привет" (но это так, пальцем в небо).
Я скорее склоняюсь к тому, что "ttyS0" - это не то устройство, к которому следует подключаться. Как раз логично: Вы пытаетесь подключиться к системному порту, запись в который запрещена, в итоге Segmentation fault.
У меня в raspberry устройство, подключаемое по внешнему порту обозначено как "/dev/ttyACM0".

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

С /dev/ttyACM0 таже самая ошибка. QserialInfo возвращает
Port: ttyAMA0
Location: /dev/ttyacm0
Description: 
Manufacturer: 
Serial number: 
Vendor Identifier: 
Product Identifier: 
Busy: No

Port: ttyS0
Location: /dev/ttyS0
Description: 
Manufacturer: 
Serial number: 
Vendor Identifier: 
Product Identifier: 
Busy: No

ttyS0 отключил от ОС.

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

это не помогло.

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

Что значит дело в девайсе? Через minicom S0 работает.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Попробуйте через терминал raspberry понять, по какому порту работает устройство: выведите список всех подключенных портов с физически подключенным вашим устройством и без него. Так поймёте точное название своего устройства. И к нему пытайтесь уже коннектиться. Возможно, QSerialInfo отрабатывает некорректно.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

А вы что-то делали с настройками uart ? Ну там отключали блютус или как-то конфигурировали ?

Deciptikon
Ответ на комментарий  Алексей
1 год назад

У меня работали в зависимости от того куда подключены (к uart или usb) следующие варианты "ttyACM0"//"ttyUSB0"

Алексей
Алексей
Ответ на комментарий  Deciptikon
1 год назад

Попробовал еще раз все собрать . Только применить ваши рекомендации по установки qt5. Устанавливал с нуля все удалил и далее по пунктам. Но на этапе make install получил:
Makefile:2283: ошибка выполнения рецепта для цели «.obj/qabstractgallery.o»
make[3]: *** [.obj/qabstractgallery.o] Ошибка 1
make[3]: выход из каталога «/home/alexey/raspberrypi/qt5/qtdocgallery/src/gallery»

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Алексей. Вы случаем виртуальную клавиатуру не делали для qt5.15?

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

нет, не приходилось. я больше со спектрометрами и фотоаппаратурой работаю.

Алексей
Алексей
Ответ на комментарий  Алексей
1 год назад

Вы пробовали делать авто монтирование и размонтирования usb флешки? И как можно определить конект флешки в qt5.15?

Дмитрий
Дмитрий
1 год назад

На 10-м шаге пишет "You don't seem to have 'make' or 'gmake' in your PATH.
Cannot proceed."
Кто-то сталкивался с этим, что делать??? нужно прописать make в PATH ???

Дмитрий
Дмитрий
Ответ на комментарий  Дмитрий
1 год назад

Проблема решилась так
sudo apt-get update
sudo apt-get install build-essential
Но теперь возникла другая: "ERROR: Feature 'pkg-config' was enabled, but the pre-condition 'tests.pkg-config' failed."

Deciptikon
Ответ на комментарий  Aveal
1 год назад

Благодарю(я зарегистрировался), облазил кучу сайтов, всюду что-то непонятное, на следующий день сам додумался попробовать установить pkg-config (не сразу додумался что это может быть что-то внутрисистемное). После этого сразу увидел ваш ответ)))) надо было раньше глянуть.
В общем почти всё получилось...
Сейчас не отображает приложения на малине, пишет "Could not find DRM device!".
Я пробовал и в другом режиме отображать (и G1 и G2) и с иксами в обоих режимах... ничего.
приложения при этом собираются и я могу зайти на малину через vnc и запустить их мышкой, работают норм, но это не полноценный кросскомпил((((((
Я на raspberry pi 3b.
Может это быть связанным с eglfs ?
(у меня при компиляции накатило таких сообщений: "qeglfsbrcmintegration.cpp:74:5: error: ‘EGL_DISPMANX_WINDOW_T’ was not declared in this scope
   EGL_DISPMANX_WINDOW_T *eglWindow = new EGL_DISPMANX_WINDOW_T;")

Deciptikon
Ответ на комментарий  Aveal
1 год назад

Я немного покопался и обнаружил что на малине в папке opt/ нет папки vc/ со всем содержимым (вроде оно и нужно для eglfs ?).
Честно говоря я не знаю как её туда добавить, наверное нужно установить какой-то пакет(несколько пакетов), но я не знаю какой...
Сами файлы libGLESv2.so.2.0.0 и libEGL.so.1.1.0 вроде есть в usr/lib/arm-linux-gnueabihf

Deciptikon
Ответ на комментарий  Deciptikon
1 год назад

возможно проблема в том что в /etc/apt/sources.list у меня написано raspbian/ bullseye а не raspbian/ buster ...

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

Aveal вы пробовали подключать внешнее библиотеки типа libmodbus? Просто не знаю как подключить внешнею библиотеку при кросс-компиляции. 

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

можете механизм по этапам расписать ?

Алексей
Алексей
Ответ на комментарий  Aveal
1 год назад

Попробовал ругается на отсутствие файла config.h.
Нашел вот такую статью https://russianblogs.com/article/22401555566/
Но не понял шаг 4. А именно

  1. ./configure --host=arm-none-linux-gnueabi --prefix=/pi/git-proj/libmodbus/install/

И после еще раз делать синхронизацию ?

Алексей
Алексей
1 год назад

Все этапы с 1 по 12 выполнены без ошибок. Настроил qt cretor. Запустил проект в отладки и получил
"Do you need "set solib-search-path" or "set sysroot"?Could not load shared library symbols for /usr/local/qt/plugins/imageformats/libqwebp.so." Как понял не видит sysroot. В qt creator в sysroot добавил "/home/alexey/raspberrypi/sysroot"

Алексей
Алексей
1 год назад

А кто нибудь ставил qt на разбери пи4 ? Попробовал сделал следующие 
на таргете apt-get install -y libqwt-dev добавил .pro CONFIG += qwt , INCLUDEPATH += /usr/include/qwt , LIBS += -lqwt но qwt не заработал. 

Сергей
Сергей
1 год назад

В чем будет отличаться процесс, если на целевой машине Ubuntu стоит и архитектура arm64, и на хост Ubuntu архитектура x86_64?

112
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x