Использование 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 шт):

Автор решения: eri

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
→ Ссылка