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
101 комментариев
старее
новее
Inline Feedbacks
View all comments
Алексей
Алексей
1 год назад

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

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

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

Артем
Артем
1 год назад

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

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

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

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

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

Павел
Павел
1 год назад

Спасибо

Артем
Артем
1 год назад

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

Вячеслав
Вячеслав
1 год назад

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

Павел
Павел
1 год назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При сообщение
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
7 месяцев назад

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

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
7 месяцев назад

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

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

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

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

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

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

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

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

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

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

Переделал всё с нуля
на 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
6 месяцев назад

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

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

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

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

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

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

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

сергей
сергей
Reply to  Dean_l
1 месяц назад

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

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

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

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

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

Алексей
Алексей
Reply to  Dean_l
21 дней назад

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

Алексей
Алексей
29 дней назад

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

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

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

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

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

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

Снова здравствуйте!
У меня получилось решить проблему.
Всего то нужно было вместо 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, но при попытке запуска приложения (оно же развертывание на "малинке") появляется ошибка о невозможности найти файл библиотеки.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

уверены ли Вы, что "/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".

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

С /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 отключил от ОС.

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

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

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

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

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

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

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

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

Deciptikon
Reply to  Алексей
4 дней назад

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

Алексей
Алексей
Reply to  Deciptikon
3 дней назад

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

Дмитрий
Дмитрий
6 дней назад

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

Дмитрий
Дмитрий
Reply to  Дмитрий
6 дней назад

Проблема решилась так
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
Reply to  Aveal
4 дней назад

Благодарю(я зарегистрировался), облазил кучу сайтов, всюду что-то непонятное, на следующий день сам додумался попробовать установить 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
Reply to  Aveal
3 дней назад

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

Deciptikon
Reply to  Deciptikon
3 дней назад

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

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

Все этапы с 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"

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