Кросскомпиляция#

Предустановка#

  • Наличие образа installation-4.7.x-huawei1.iso

  • Наличие образа installation-1.7.x.iso

Установка#

  1. Установка образа п.1 Предустановка через Менеджер виртуальных машин (отдельная инструкция) Предлагаемый размер диска - 20Гб

  2. Установка образа п.2 Предустановка через Менеджер виртуальных машин. Предлагаемый размер диска - 35Гб

  3. Проверка сетевой доступности двух виртуальных машин выполнить на виртуальных машинах команду ip addr ping <адрес вм>

  4. На виртуальной машине с ОС 4.7.x (далее гостевая вм) необходимо установить следующие пакеты командой:

sudo apt install openssh-server rsync qt5-qmake libqt5gui5 libqt5webengine-data libqt5webkit5 libudev-dev libinput-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver pkg-config mesa-utils libgles2-mesa-dev libdrm-dev libgbm-dev libxcb-icccm4-dev libxcb-util0-dev libxcb-shm0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev icu-devtools libicu-dev libicu63 libxcb-xinput-dev libx11-xcb-dev libpcre2-dev libdouble-conversion-dev libssl-dev libjpeg-dev libpng-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-composite0-dev libxcb-cursor-dev libxcb-present-dev libqudev-dev libxrandr-dev libfontconfig1-dev libfreetype6-dev qtbase5-dev qtbase5-dev-tools
  1. Создаем папку для дальнейшего развертывания Qt и присваиваем права командами:

sudo mkdir /usr/local/qt
sudo chown <пользователь>:<группа> /usr/local/qt
  1. На виртуальной машине с ОС 1.7.x (далее хостовая вм) необходимо установить пакеты командой:

sudo apt install openssh-server g++ qtcreator gcc-8-arm-linux-gnueabi g++-8-arm-linux-gnueabi gdb-multiarch rsync gcc-8-aarch64-linux-gnu g++-8-aarch64-linux-gnu
  1. Создать папку, где будет храниться наш собранный Qt, командой и перейдем в нее:

mkdir ~/armqt
cd ~/armqt
  1. Создать папку с sysroot для кросс-компиляции командой:

mkdir sysroot sysroot/usr sysroot/opt
  1. Синхронизировать sysroot на хостовую вм с гостевой вм командами:

rsync -avz <имя пользователя>@<IP-адрес гостевой вм>:/lib sysroot
rsync -avz <имя пользователя>@<IP-адрес гостевой вм>:/usr/include sysroot/usr
rsync -avz <имя пользователя>@<IP-адрес гостевой вм>:/usr/lib sysroot/usr
  1. Необходимо заменить символьные ссылки sysroot на относительные с помощью скрипта:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
  1. Необходимо скачать исходный код Qt версии 5.15.2 (название архива qt-everywhere-src-5.15.2.tar.xz).

  2. Разархивировать командой:

tar xf qt-everywhere-src-5.15.2.tar.xz

Разархивировать лучше в корень домашней папки! При работе из папки загрузок могут быть проблемы на шаге 14.

  1. Необходимо заменить название компиляторов в файле по пути qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf в графе # modifications to g++.conf на:

aarch64-linux-gnu-gcc-8
aarch64-linux-gnu-g++-8
aarch64-linux-gnu-g++-8
aarch64-linux-gnu-g++-8
  1. Зайти в папку скачанного Qt и выполнить конфигурацию следующей командой:

cd qt-everywhere-src-5.15.2
./configure -no-opengl -xplatform linux-aarch64-gnu-g++ -device-option CROSS_COMPILE=arm-linux-gnueabi -sysroot ~/armqt/sysroot -prefix /usr/local/qt -extprefix ~/armqt/qt -hostprefix ~/armqt/host-qt -opensource -confirm-license -release -skip serialport -skip serialbus -skip quick3d -skip location -nomake tests -nomake examples -v -recheck

более подробную информацию об опциях конфигурации можно посмотреть с помощью команды: configure -help

Примечание

При неудачной сборке рекомендуется удалить папку с Qt и повторить шаги 12-14

Если будут ошибки про неподписанные исполняемые файл / библиотеки, сопровождающиеся уведомлениями астры, нужно в панель управления → безопасность → политика безопасности → замкнутая программная среда → выключить.

  1. После успешной компиляции выполнить сборку командой:

make

дополнительно можно запустить make в несколько потоков с помощью команды: make -j4 (где 4 — количество потоков )

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

  1. После успешной сборки выполнить установку командой:

make install
  1. Разворачиваем собранный Qt на гостевой вм командами:

cd ~/armqt
rsync -avz qt <имя пользователя>@<IP-адрес гостевой вм>:/usr/local
  1. Далее необходимо настроить Qt Creator на сборку нашего приложения.

Добавляем устройство в Qt Creator. Переходим в меню Tools - Options, открываем раздел Devices и добавляем Generic Linux Device:

  • Ввести название

  • Нажать кнопку Add…

../../_images/install_1.png
  1. Выбрать «Generic Linux Device»

../../_images/install_2.png
  • Ввести наименование конфигурации

  • Ввести IP-адрес ГОСТЕВОЙ вм

  • Ввести логин пользователя

../../_images/install_3.png
  1. Создать приватный ключ

Передать ключ на гостевую машину кнопкой Deploy

../../_images/install_4.png

Произойдет проверка устройства

../../_images/install_5.png

Идем в раздел Kits на вкладку Compilers и добавляем компиляторы для C и C++ (могут быть уже добавлены автоматически):

../../_images/install_6.png
../../_images/install_7.png

В том же разделе на вкладке Debuggers добавляем отладчик:

../../_images/install_8.png

Дальше по списку вкладка Qt Versions, где мы добавляем версию Qt:

../../_images/install_11.png

На вкладке Kits, добавим набор инструментов, которые мы будем использовать для ARM. Выбираем все, что мы добавили ранее:

../../_images/install_9.png

Build device не трогаем (может оставаться desktop).

Теперь при создании нового проекта будет доступен созданный набор, названный нами - ARM Desktop. Переходим к созданию тестового проекта.

Создание проекта#

  1. Открыть File ‣ New File or Project

  2. Application (Qt) ‣ Qt Widgets Application

  3. Ввести наименование проекта и папку хранения.

  4. Выбрать Build system ‣ qmake

  5. Ввести наименования классов (можно оставить по умолчанию)

  6. При необходимости выбрать файл перевода (этот шаг можно пропустить и не заполнять)

  7. Выбрать Kit который мы ранее создали — ARM Desktop

  8. Нажать Завершить

  9. В настройках проекта в .pro файле можно задать путь для установки приложения на ARM (на ГОСТЕВОЙ вм):

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /home/administrator/Qt_Projects/$${TARGET}
!isEmpty(target.path): INSTALLS += target
  • Перейти на вкладку Projects и установить чекбокс «Forward to local display»

../../_images/install_10.png
  • Запустить сборку и разворачивание проекта. При успешной сборке и разворачивании отобразиться окно на хостовой вм, а в папке на гостевой вм (/home/administrator/QT-projects/<название проекта>) появится наше приложение.