Кросс-компиляция Qt 5.9.3 для Raspberry PI3

Изначально на моем ПК было установлено 2 операционные системы Kubuntu 16.04×64 и Windows 7×64. Первый попавшийся способ установки Qt 5.9 на Raspberry PI3 у меня заканчивался различными ошибками, поэтому пришлось воспользоваться стандартным способом, описанным здесь. Данный способ не предназначен для запуска qt приложений поверх x11:

  1. [на хосте] Идем на сайт raspberrypi и скачиваем последний доступный образ RASPBIAN STRETCH WITH DESKTOP.
  2. [на хосте] Устанавливаем программу для записи образов на флешки etcher. Записываем скачанный образ.
  3. [на rpi3] Вставляем sd-карту в малину, загружаемся. Переходим в Menu — Preferences — Raspberry Pi Configuration. Включаем ssh.
  4. [на rpi3] Далее переходим в Menu — Preferences — Raspberry Pi Configuration — Performance. Выставляем значение GPU memory 256. Пункты 4 и 5 можно сделать с помощью команды в терминале:
    sudo raspi-config
  5. [на rpi3] Вбиваем в терминале ifconfig и запоминаем ip адрес малины.Через Kubuntu (PC) можно приконектиться к малине через SSH и проделать нижеуказанные пункты через ПК. Но я проделывал их на самой малине. На Raspberry изменяем файл sources.list , откоментировав строку deb-src :
    sudo nano /etc/apt/sources.list
  6. [на rpi3] Обновляем систему и устанавливаем необходимые библиотеки:
    sudo apt-get update
    sudo apt-get build-dep qt4-x11
    sudo apt-get build-dep libqt5gui5
    sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
  7. [на rpi3] Подготавливаем целевую директорию:
    sudo mkdir /usr/local/qt5pi
    sudo chown pi:pi /usr/local/qt5pi
  8. [на хосте] Создаем рабочую директорию raspi в home и качаем toolchain:
    mkdir ~/raspi
    cd ~/raspi
    git clone https://github.com/raspberrypi/tools
  9. [на хосте] В рабочей директории создаем папку sysroot и через rsync производим синхронизацию с малиной, откуда будем выкачивать библиотеки и заголовочные файлы:
    mkdir sysroot sysroot/usr sysroot/opt
    rsync -avz pi@ipадресмалины:/lib sysroot
    rsync -avz pi@ipадресмалины:/usr/include sysroot/usr
    rsync -avz pi@ipадресмалины:/usr/lib sysroot/usr
    rsync -avz pi@ipадресмалины:/opt/vc sysroot/opt
  10. [на хосте] Поправляем символьные ссылки относительно sysroot. Скачиваем и запускаем готовый скрипт:
    wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
    chmod +x sysroot-relativelinks.py
    ./sysroot-relativelinks.py sysroot
  11. [на хосте] Клонируем qt , только базовую папку qtbase:
    git clone git://code.qt.io/qt/qtbase.git -b 5.9

    Переходим в папку qtbase , конфигурируем и компилируем qt :

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

    Если попытка оказаалсь неудачной, то для очистки кеша используем команду:

    git clean -dfx
  12. [на rpi3] Обновялем устройство , чтобы позволить компоновщику найти qt библиотеки. Настраиваем привязку динамических ссылок с помощью команды ldconfig:
    echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
    sudo ldconfig
     
    # или если не получится ,то так
    echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/00-qt5pi.conf
    sudo ldconfig
  13. [на rpi3] Исправляем пути к библиотекам EGL/GLES. В rpi3 cтандартно используются библиотеки libEGL и libGLESv2 от MESA драйвера из папки /usr/lib/arm-linux-gnueabihf, нам же необходимо использовать дргую версию этих библиотек из /opt/vc/lib:
    sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
    sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
    sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
    sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
    sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
    sudo ln -s /opt/vc/lib/libGLESv2.s
  14. [на хосте] Теперь можно загрузить пример qopenglwidget , выполнив следующие команды:
    cd qtbase/examples/opengl/qopenglwidget
    ~/raspi/qt5/bin/qmake
    make
    
    scp qopenglwidget pi@raspberrypi.local:/home/pi

    Если возникают проблемы с запуском примера, то смотрим по правильному ли адресу лежат библиотеки:

    ldd ./qopenglwidget

    Или же , смотрим на логи ошибок при запуске qt-приложения:

    export QT_LOGGING_RULES=qt.qpa.*=true
    ./qopenglwidget
  15. [на хосте] Доставляем по выбору необходимые модули Qt. Я доставлял бибилотеки , которые присутствуют в QtRpi — qtdeclarative, qtquickcontrols, qtquickcontrols2, qtserialport, qtsvg, qt3d:
    git clone git://code.qt.io/qt/qtdeclarative.git -b 5.9
    cd qtdeclarative
    ~/raspi/qt5/bin/qmake
    make
    make install
     
    rsync -avz qt5pi pi@raspberrypi.local:/usr/local
  16. [на хосте] Настраиваем QtCreator. В системе должен быть устанавлен Qt, если он не установлен, то проделываем следующее:
    wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
    cd ~/Downloads/
    chmod u+x qt-unified-linux-x64-online.run
    ./qt-unified-linux-x64-online.run

    У меня в системе был установлен Qt 5.9.2 , а кросс-компилятор под raspberry pi 3 я собрал версии 5.9.3.