Использование Qt на Raspberry Pi
существует достаточно большое количество разных гайдов о том как работать с кросскомпиляцией приложений на raspberry pi. Однако недостатком такого подхода является то, что при распространении скомпилированного приложения необходимо таскать еще и библиотеки (.so) самого Qt. При этом если формируются debian пакеты для распространения приложения то необходимо qt-библиотеки оформлять в виде отдельного пакета, что кажется абсурдно.
В родном репозитории raspbian (buster) есть все необходимые библиотеки qt. Их можно установить путем установки пакета qt5-default. Установка данного пакета влечет за собой как установку утилит (типа qmake) так и самих библиотек.
Далее я пытаюсь собрать приложение прямо на малинке. Собираю 2 приложения. Первое чисто консольное, второе GUI на QtWidgets. Приложения собираются нормально, ошибок сборки нет.
Консольное тестовое приложение запускается нормально и отрабатывает без ошибок.
Приложение с GUI на QtWidgets запускается с ошибкой
qt.qpa.screen: QXcbConnection: Could not connect to display
Could not connect to any X display.
Приложение с GUI можно запустить через ssh -X с удаленного компьютера и при этом приложение запускается без проблем и интерфейс отображается корректно.
При попытке исследования проблем с плагинами export QT_DEBUG_PLUGINS=1 получаю такой вывод приложения:
QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqeglfs.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqeglfs.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"eglfs"
]
},
"className": "QEglFSIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("eglfs")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqlinuxfb.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqlinuxfb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"linuxfb"
]
},
"className": "QLinuxFbIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("linuxfb")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqminimal.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqminimal.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimal"
]
},
"className": "QMinimalIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("minimal")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqminimalegl.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqminimalegl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimalegl"
]
},
"className": "QMinimalEglIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("minimalegl")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqoffscreen.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqoffscreen.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"offscreen"
]
},
"className": "QOffscreenIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("offscreen")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqvnc.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqvnc.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"vnc"
]
},
"className": "QVncIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("vnc")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqxcb.so"
Found metadata in lib /usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqxcb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"xcb"
]
},
"className": "QXcbIntegrationPlugin",
"debug": false,
"version": 330499
}
Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/Software/buster_GUI_test/platforms" ...
loaded library "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqxcb.so"
qt.qpa.screen: QXcbConnection: Could not connect to display :0
Could not connect to any X display.
QLibraryPrivate::unload succeeded on "/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms/libqxcb.so"
Как видно. Плагины находятся корректно, однако все равно правильный экран не находится.
Как быть? Как победить это все? Как вообще можно использовать стандартный qt5. Еще забыл уточнить, что использую Raspbian в лайт версии, т.е. без desctop.
Ответы (1 шт):
Qt в пакетах настроенна на запуск только с платформы xcb и соответственно ищет Иксы. Для запуска без иксов на ./app -platform eglfs или QT_QPA_PLATFORM=eglfs ./app
Подробнее https://wiki.qt.io/RaspberryPi2EGLFS
Также можно попробовать платформу linuxfb если в приложении нет тяжелой графики.
Запуск на голых иксах я делаю так:
xinit /opt/kiosk/bin/xapp.sh -- :1 -nolisten tcp -noreset -verbose 2 "vt1"
где /opt/kiosk/bin/xapp.sh что-то вроде
#!/bin/bash
export DISPLAY=:1
metacity --replace & # <- любой оконный менеджер
/opt/kiosk/bin/app