Сэмулируй сборку приложения ARM на x86 процессоре на примере Qt

Мощность современных процессоров растёт, как в стационарных компьютерах, так и в различных embedded устройствах, на борту которых процессоры на базе ARM с операционной системой linux. Сегодня в рамках данной статьи мы запустим эмулятор процессора ARM на x86 компьютере и в нём попробуем собрать Qt из исходников и тестовое приложение, т.е. так сказать сиэмулируем сборку ARM приложения.

В первой части статьи будем использовать эмулятор QEMU для aarch64, во второй части запустим эмулятор Raspberry и проверим работоспособность приложения в нём.

От себя хочу отметить, это все делается не быстро, и если Вы попробуете все это выполнить, то полный цикл займет у вас несколько дней!)

viea5bfhgrexrufwkugdzygykbw.png

Собираем из исходников Qt на CentOS ARM


Для установки на хост системе нам потребуется установить эмулятор QEMU. В Debian based дистрибутивах это пакет qemu-system-arm. Для управления виртуальной машины в графическом режиме можно установить virt-manager.

После запуска создаем виртуальную машину:

ynnranvljnasxewdcrtxw5vcpog.png

и выбираем сетевую загрузку c url:
mirror.centos.org/altarch/7/os/aarch64

2l1c2kgnhrrtnfwgosqqnliztfw.png

Задаём количество процессоров и оперативной памяти:

nay55z6sfedmbh50sylkxghogm0.png

Задаём размер системного диска:

zqut20otqivez4pphcjjnyrizpo.png

Финальные настройки, выбор сети:

vglpqbqb3sh3kp2e7q8jmcb4wmw.png

Для тех, кто хочет загружать или устанавливать оффлайн, есть образ диска:

arm64

Дальше необходимо установить систему на жёсткий диск в текстовом режиме, выбирая необходимые варианты ответов, и подтверждая ответами yes:

jdwq6ckpn8hlmowynpmrih12rva.jpeg

80gq6fdioawqei_fzubgyfgubse.jpeg

Сборку будем совершать на втором виртуальном диске, для этого нам достаточно будет диска на 25–30 Gb. Создаем новый жесткий диск, выключив виртуальную машину и подключив его к ней и после этого запускаем снова. Разобьем наш жесткий диск и отформатируем:

cfdisk /dev/sdb
mkfs.ext4 /dev/sdb1 -L Qt_Rebuild
mount /dev/sdb1 /30


А почему файловая система не XFS

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


После установки, подключаемся в виртуальную машину и устанавливаем необходимые нам пакеты:

yum install centos-release-scl
yum install devtoolset-9-gcc.aarch64
yum install git
export PATH=/opt/rh/devtoolset-9/root/bin/:$PATH
echo clone from git
cd /30
git clone --recursive --single-branch --branch 5.15 git://github.com/qt/qt5.git
cd qt5


Конфигурируем:


./configure -skip qt3d -no-warnings-are-errors -release -recheck-all --prefix /Qt/5.15.0 -opensource -confirm-license -nomake examples -nomake tests -c++std c++17 -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ -xcb-xlib -xcb -feature-thread -feature-xkbcommon -qt-libpng -qt-libjpeg -qt-zlib -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ --recheck-all
...
You need perl in your PATH to make a build from GIT.
Cannot proceed.

#yum install perl


Повторяем запуск конфигурирования и получаем:


Creating qmake...
gmake: g++: Command not found
gmake: *** [main.o] Error 127


Установим компилятор и снова конфигурируем:

yum install devtoolset-9-gcc-c++.aarch64
...
ERROR: Feature 'xcb' was enabled, but the pre-condition 'features.thread && libs.xcb && tests.xcb_syslibs && features.xkbcommon-x11' failed.

ERROR: Feature 'xcb-xlib' was enabled, but the pre-condition 'features.xlib && libs.xcb_xlib' failed.

ERROR: Feature 'xkbcommon' was enabled, but the pre-condition 'libs.xkbcommon' 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.


Ищем и доставляем необходимые пакеты:


yum install libxkbcommon-x11-devel
yum install xcb-util-renderutil-devel
yum install libxcb libxcb-devel libXrender libXrender-devel xcb-util-wm xcb-util-wm-devel xcb-util xcb-util-devel xcb-util-image xcb-util-image-devel xcb-util-keysyms xcb-util-keysyms-devel


Конфигурируем, и получаем уже одну ошибку:

ERROR: Feature 'xcb-xlib' was enabled, but the pre-condition 'features.xlib && libs.xcb_xlib' failed.


Добавляем еще пакетов и смотрим лог конфигурирования:

 yum install libxcb libxcb-devel xcb-util xcb-util-devel mesa-libGL-devel libxkbcommon-devel
...
Checking for XCB ICCCM >= 0.3.9... yes
Checking for XCB SHM... yes
Checking for XCB Image >= 0.3.9... yes
Checking for XCB Keysyms >= 0.3.9... yes
Checking for XCB RandR... yes
Checking for XCB XRender... yes
Checking for XCB Renderutil >= 0.3.9... yes
Checking for XCB Shape... yes
Checking for XCB Sync... yes
Checking for XCB Xfixes... yes
Checking for XCB Xinerama... yes
Checking for XCB XKB... yes
Checking for XCB (extensions)... yes
Checking for xkbcommon >= 0.5.0... yes
Checking for xkbcommon-x11... yes
…
Checking for XCB Xlib... yes
Checking for XCB GLX... yes
...
Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into '/Qt/5.15.0'.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.


Ну что же, всё готово, но нужно проверить опции, которые возможно нам пригодятся:

  OpenGL:
    Desktop OpenGL ....................... yes
    OpenGL ES 2.0 ........................ no
    OpenGL ES 3.0 ........................ no
    OpenGL ES 3.1 ........................ no
    OpenGL ES 3.2 ........................ no

  OpenSSL ................................ no
    Qt directly linked to OpenSSL ........ no
  OpenSSL 1.1 ............................ no


И всё таки сетевое взаимодействие приложения нам наверное потребуется, не работать же только по http:

yum install openssl-devel

Dependencies Resolved

================================================================================
 Package                   Arch          Version               Repository  Size
================================================================================
Installing:
 openssl-devel             aarch64       1:1.0.2k-19.el7       base       1.5 M
Installing for dependencies:
 keyutils-libs-devel       aarch64       1.5.8-3.el7           base        37 k
 krb5-devel                aarch64       1.15.1-46.el7         base       272 k
 libcom_err-devel          aarch64       1.42.9-17.el7         base        31 k
 libkadm5                  aarch64       1.15.1-46.el7         base       175 k
 libselinux-devel          aarch64       2.5-15.el7            base       186 k
 libsepol-devel            aarch64       2.5-10.el7            base        76 k
 libverto-devel            aarch64       0.2.5-4.el7           base        11 k
 pcre-devel                aarch64       8.32-17.el7           base       479 k
 zlib-devel                aarch64       1.2.7-18.el7          base        49 k

Transaction Summary
================================================================================
Install  1 Package (+9 Dependent packages)

Total download size: 2.8 M
Installed size: 6.4 M
Is this ok [y/d/N]: 


Версия 1.0.2k, что меньше, чем просит Qt (Increased the minimum supported version of OpenSSL to 1.1.)

Придётся нам собрать OpenSSL и потом уже собирать Qt из исходников:

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
-bash: wget: command not found
cd /
curl https://www.openssl.org/source/openssl-1.1.1g.tar.gz -o openssl-1.1.1.g.tar.gz
tar -xvf openssl-1.1.1.g.tar.gz 
cd /openssl-1.1.1g
perl Configure
echo выяснив тип архитектуры, конфигурируем под ARM:
perl Configure linux-aarch64
Configuring OpenSSL version 1.1.1g (0x1010107fL) for linux-aarch64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub   ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************
make && make install


Дальше снова конфигурируем Qt и запускаем его сборку командой make или make -j4, согласно количеству процессоров (если вы решили создать VM с 4 м процессорами), которые заданы в настройках виртуалки.

Сборка приложения падает на:

make[3]: Entering directory `/30/qt5/qtsvg/src/svg'
g++ -c -include .pch/Qt5Svg -pipe -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -Wextra -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -Wno-stringop-overflow -Wno-format-overflow -D_REENTRANT -fPIC -DQT_NO_LINKED_LIST -DQT_NO_FOREACH -DQT_NO_USING_NAMESPACE -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_SVG_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_DEPRECATED_WARNINGS_SINCE=0x060000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_ZLIB_LIB -I. -I../../include -I../../include/QtSvg -I../../include/QtSvg/5.15.0 -I../../include/QtSvg/5.15.0/QtSvg -I/30/qt5/qtbase/include/QtWidgets/5.15.0 -I/30/qt5/qtbase/include/QtWidgets/5.15.0/QtWidgets -I/30/qt5/qtbase/include/QtGui/5.15.0 -I/30/qt5/qtbase/include/QtGui/5.15.0/QtGui -I/30/qt5/qtbase/include/QtCore/5.15.0 -I/30/qt5/qtbase/include/QtCore/5.15.0/QtCore -I/30/qt5/qtbase/include -I/30/qt5/qtbase/include/QtWidgets -I/30/qt5/qtbase/include/QtGui -I/30/qt5/qtbase/include/QtCore -I/30/qt5/qtbase/include/QtZlib -I/30/qt5/qtbase/include/QtZlib/5.15.0 -I/30/qt5/qtbase/include/QtZlib/5.15.0/QtZlib -I.moc -I/usr/include/libdrm -I/usr/include/xcb -I/usr/include/xcb -I/30/qt5/qtbase/mkspecs/linux-g++ -o .obj/qsvgfont.o qsvgfont.cpp
In file included from /30/qt5/qtbase/include/QtGui/qopenglversionfunctions.h:1,
                 from /30/qt5/qtbase/include/QtGui/../../src/gui/kernel/qopenglcontext.h:61,
                 from /30/qt5/qtbase/include/QtGui/qopenglcontext.h:1,
                 from /30/qt5/qtbase/include/QtGui/QtGui:49,
                 from ../../include/QtSvg/QtSvgDepends:4:
/30/qt5/qtbase/include/QtGui/../../src/gui/opengl/qopenglversionfunctions.h: In instantiation of ‘class QVector’:
qsvgstyle_p.h:696:20:   required from here
/30/qt5/qtbase/include/QtGui/../../src/gui/opengl/qopenglversionfunctions.h:201:5: internal compiler error: in tsubst_function_decl, at cp/pt.c:12967
  201 |     QAbstractOpenGLFunctionsPrivate()
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See  for instructions.
make[3]: *** [.obj/qsvgfont.o] Error 1
make[3]: Leaving directory `/30/qt5/qtsvg/src/svg'
make[2]: *** [sub-svg-make_first-ordered] Error 2
make[2]: Leaving directory `/30/qt5/qtsvg/src'
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory `/30/qt5/qtsvg'
make: *** [module-qtsvg-make_first] Error 2


Устанавливаем допонительные версии пакетов и с попытки 3 у нас это получается:

  1. yum install harfbuzz-devel
  2. yum install at-spi2-atk-devel at-spi2-core-devel dbus-devel glib2-devel graphite2-devel keyutils-libs-devel krb5-devel libcom_err-devel libicu-devel libselinux-devel libsepol-devel libverto-devel pcre-devel zlib-devel
  3. yum install mesa-libGLw-devel


Конфигурирование и сборка проходит. Создаем в QtCreator тестовое приложение (со сборкой qmake), копируем исходники в виртуальную машину и собираем приложение. Бинарь готов, осталось проверить его на Raspberry.

2. Запускаем в эмуляторе Raspberry


Так как в рамках данной статьи мы эмулируем ARM процессор, значит запукать будем тоже в виртуальной машине ссылка 1ссылка 2 ссылка 3:

Скачиваем официальный образ с сайта Raspberry, ядро для эмулятора и запускаем (я создал такой запускной файл):


echo create disk for Qt sources and Projects
qemu-img create -f qcow2 qt-rebuild-25gb-disk.qcow2 25G
cat start-emul.sh
#!/bin/bash

path_img=/home/user/Project/qemu
path_kernel=/home/user/qemu/qemu-rpi-kernel
sudo qemu-system-arm -kernel $path_kernel/kernel-qemu-4.19.50-buster -dtb $path_kernel/versatile-pb-buster.dtb \
-cpu arm1176 -m 256 -M versatilepb -append "root=/dev/sda2 rw" -net nic -net user,hostfwd=tcp::5022-:22 \
-net tap,ifname=vnet0,script=no,downscript=no -hdb $path_img/qt-rebuild-25gb-disk.qcow2 -no-reboot -hda $path_img/2020-05-27-raspios-buster-armhf.img


Пробуем запустить наше приложение:

utmgv0t876svxy0ppytw4lwget4.png

Почему так? Смотрим процессор:

w2thobh-hp57tldcnwzipdv9zky.png

Смотрим файл конфигурации в CentOS:

[root@aaarch-qemu qt5]# cat config.summary |grep CPU
Build type: linux-g++ (arm64, CPU features: cx16 neon)


Ну что же, мы собрали приложение для armv8 64 битное, и пытаемся запустить его в 32 битном эмуляторе с процессором armv6. Надеюсь, что владельцы реальных устройств с новыми 64 битными процессорами смогут отписаться в комментариях, получилось ли у них запустить приложение на реальном устройстве или нет.

Ну что же, не беда, мы же можем теперь собирать и в эмуляторе Raspberry? Обнаруживаем, что у нас очень мало свободного места на диске, после вызова команды df -h. Наиболее простой способ оказался скопировать файл образа, его увеличить, стартануть виртуальную машину с двумя файловыми системами, увеличив корневой раздел на второй машине, и после этого использовать второй образ. Поехали:

qemu-img convert 2020-05-27-raspios-buster-armhf.img 2020-05-27-raspios-buster-armhf-10gb.qcow2 -O qcow2 -p
qemu-img resize 2020-05-27-raspios-buster-armhf-10gb.qcow2 +6G


В скрипт запуска добавьте еще один жесткий диск:

-hdc 2020–05–27-raspios-buster-armhf-10gb.qcow2

После запуска отредактируйте этот жесткий дискsudo cfdisk /dev/sdc:

Resize:

tr-xaly4mqpyv9ytfpkod3kuy5k.png

Write и подтверждение yes:

g5dbbj0wdqinwsfdmtrkmjxc-ss.png

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

sudo mkdir /test
sudo mount /dev/sdc2 /test
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       3.2G  2.8G  257M  92% /
devtmpfs        124M     0  124M   0% /dev
tmpfs           124M     0  124M   0% /dev/shm
tmpfs           124M  2.0M  122M   2% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           124M     0  124M   0% /sys/fs/cgroup
/dev/sdc1       253M   51M  202M  21% /boot
tmpfs            25M     0   25M   0% /run/user/1000
/dev/sdc2       3.2G  2.7G  358M  89% /test


Что-то размер диска sdc, подключенного к папке /test не добавился, давайте это исправлять:

sudo umount /test
sudo fsck -f /dev/sdc2
sudo resize2fs /dev/sdc2
resize2fs 1.44.5 (15-Dec-2018)
Please run 'e2fsck -f /dev/sdc2' first.

pi@raspberrypi:~ $ e2fsck -f /dev/sdc2
e2fsck 1.44.5 (15-Dec-2018)
e2fsck: Permission denied while trying to open /dev/sdc2
You must have r/w access to the filesystem or be root
pi@raspberrypi:~ $ sudo e2fsck -f /dev/sdc2
e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs: 106640/217296 files (0.3% non-contiguous), 729343/868352 blocks
pi@raspberrypi:~ $ sudo resize2fs /dev/sdc2
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/sdc2 to 2441216 (4k) blocks.
The filesystem on /dev/sdc2 is now 2441216 (4k) blocks long.

sudo mount /dev/sdc2 /test
pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       3.2G  2.8G  259M  92% /
devtmpfs        124M     0  124M   0% /dev
tmpfs           124M     0  124M   0% /dev/shm
tmpfs           124M  2.0M  122M   2% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           124M     0  124M   0% /sys/fs/cgroup
/dev/sdc1       253M   51M  202M  21% /boot
tmpfs            25M     0   25M   0% /run/user/1000
/dev/sdc2       9.2G  2.7G  6.0G  31% /test


Выключаем виртуалку. Снова редактируем файл start-emul.sh, заменив жесткий диск hda на новый, и удалив ссылку на третий жесткий диск -hdc. Теперь у нас файловая система с большим пространством.

Теперь мы можем подключить жесткий диск с исходниками Qt от первой виртуалки.

Совет: лучше всего «зачистить исходники» от временных файлов, т.е. вернуть наше состояние гит, которое было на момент клонирования репозитария перед конфигурированием:

cd /30/qt5
git reset --hard
git submodule foreach --recursive 'git reset HEAD . || :'
git submodule foreach --recursive 'git checkout -- . || :'
git clean -d -f -f -x
git submodule foreach --recursive git clean -d -f -f -x


Итак в Debian нам потребуются:

sudo apt install gcc-arm-none-eabi 
sudo apt install wget build-essential \
 ^libxcb.*-dev \
libopenal-dev \
flite1-dev   libspeechd-dev \
libudev-dev \
libinput-dev \
libxkbcommon-x11-dev curl libssl-dev time -y

sudo apt install libx11-dev -y \
    libfontconfig1-dev \
    libfreetype6-dev \
    libx11-dev \
    libxext-dev \
    libxfixes-dev \
    libxi-dev \
    libxrender-dev \
    libxcb1-dev \
    libx11-xcb-dev \
    libxcb-glx0-dev \
    libxkbcommon-x11-dev \
    mesa-common-dev \
libgl1-mesa-dev 


Конфигурируем:


cd /30/qt5
./configure -skip qt3d -no-warnings-are-errors -release -recheck-all -prefix /Qt/5.15.0 -opensource -confirm-license -nomake examples -nomake tests -c++std c++17 -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ -xcb-xlib -xcb -feature-thread -feature-xkbcommon -qt-libpng -qt-libjpeg -qt-zlib -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ --recheck-all -skip wayland -skip qtwebengine -skip qtwayland


Так же получив ошибки:

ERROR: Feature 'xcb-xlib' was enabled, but the pre-condition 'features.xlib && libs.xcb_xlib' 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.


Совет. Вы набирали эти команды в графическом окошке QEMU? Не забывайте, у нас же есть ssh: нужно стартануть в виртуалке ssh server: sudo systemctl start ssh && sudo systemctl enable ssh и подключаться к виртуалки с локального компьютера ssh pi@localhost -p 5022 пользователь pi пароль raspberry

Установим еще dev пакеты:

sudo apt install wget build-essential  ^libxcb.*-dev libopenal-dev flite1-dev   libspeechd-dev libudev-dev libinput-dev libxkbcommon-x11-dev curl libssl-dev time -y
sudo apt install libasound2-dev libavcodec-dev libclipper-dev libdbus-1-dev libdrm-dev libegl-dev libgles2-mesa-dev
sudo  apt install libx11-dev libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxkbcommon-x11-dev mesa-common-dev libgl1-mesa-dev


Конфигурируем и получаем вывод результатов конфигурирования:
time ./configure -skip qt3d -no-warnings-are-errors -release -recheck-all -prefix /Qt/5.15.0 -opensource -confirm-license -nomake examples -nomake tests -c++std c++17 -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ -xcb-xlib -xcb -feature-thread -feature-xkbcommon -qt-libpng -qt-libjpeg -qt-zlib -I /usr/include/xcb/ -L /usr/lib/x86_64-linux-gnu/ --recheck-all -skip wayland -skip qtwebengine -skip qtwayland

…Done.
Info: creating super cache file /30/qt5/.qmake.super
Info: creating cache file /30/qt5/.qmake.cache
Info: creating stash file /30/qt5/.qmake.stash

This is the Qt Open Source Edition.

You have already accepted the terms of the Open Source license.

Running configuration tests…

Note: Option 'cache_use' with value 'none' was specified twice

Note: Also available for Linux: linux-clang linux-icc

Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing.

WARNING: QDoc will not be compiled, probably because libclang could not be located. This means that you cannot build the Qt documentation.

Either ensure that llvm-config is in your PATH environment variable, or set LLVM_INSTALL_DIR to the location of your llvm installation.
On Linux systems, you may be able to install libclang by installing the libclang-dev or libclang-devel package, depending on your distribution.
On macOS, you can use Homebrew’s llvm package.
On Windows, you must set LLVM_INSTALL_DIR to the installation path.

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into '/Qt/5.15.0'.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

real 91m49.471s
user 78m43.608s
sys 7m22.934s


Вывод информации о результате конфигурирования

Те, кто дочитал до данного места и у кого остался еще энтузиазм попробывать это, было бы интересно получить Ваш FPS результат скорости выполнения этапа конфигурирования с описанием процессора, на котором Вы запускали. Данный результат, это запуск на Intel Core i5 7th Gen. Для эксперимента, перез запуском, выполните совет по «зачистке» исходников из предыдущей графы статьи.

Теперь 1 ядро вашего компьютера будет очень много времени собирать Qt и возможно соберёт, а возможно появится ошибка, что не хватает памяти или ошибка при сборке. Для этого рекомендую создать файл подкачки на 1–1,5 Gb и подключить его:

sudo dd if=/dev/zero of=/30/swap1500 bs=256M count=6 status=progress
dd: memory exhausted by input buffer of size 268435456 bytes (256 MiB)

sudo dd if=/dev/zero of=/30/swap1500 bs=128M count=12 status=progress
1610612736 bytes (1.6 GB, 1.5 GiB) copied, 82 s, 19.6 MB/s
12+0 records in
12+0 records out
1610612736 bytes (1.6 GB, 1.5 GiB) copied, 82.223 s, 19.6 MB/s

sudo chmod 600 /30/swap1500
sudo mkswap /30/swap1500
Setting up swapspace version 1, size = 1.5 GiB (1610608640 bytes)
no label, UUID=af79f154-6904-4b6d-8c1d-61890bdda556

sudo swapon /30/swap1500

free
              total        used        free      shared  buff/cache   available
Mem:         252228       24652      142532         536       85044      179184
Swap:       1675256       69888     1605368


Собираем и устанавливаем:

make && sudo make install


Если необходимо дополнительные модули, тогда мы всегда можем их дособрать, например для qtquickcontrols2:

export PATH=/Qt/5.15.0/bin:$PATH
cd /30/qt5/qtuickcontrols2/
qmake
make && sudo make install


После этого собираем приложение, и запускаем его:

mijjhmcwuc2q2xq7f8ti96pvrs0.jpeg

Заключение


Собирать приложения для ARM возможно на x86 устройствах, используя эмулятор QEMU. Я думал, что напишу данную статью за одну неделю, но процесс затянулся практически на три недели, потому что каждый из этапов длится очень долго (установка системы, обновление системы, установки dev пакетов, а так же получение исходных кодов Qt из гитхаб). К примеру сборка static версии Qt в эмуляторе Raspberry занял у меня 1426 минут.

А можно ли быстрее? Да, это называется Cross build. Для этого конфигурируют sysroot, устанавливают компилятор для ARM, конфигурируют и собирают Qt в вашей host системе. Потом настраивают QtCreator на использование данной версии Qt и собирая приложение на своём компьютере/ноутбуке x86, получают версию, которая будет работать в embedded linux. ссылка 1 ссылка 2 Т.к. это уже выходит за рамки данной статьи, возможно я напишу и про это, если у меня появится время или вдохновение, но может быть кто-то и другой напишет, как это сделать для последней версии Qt 5.15.

Ну повторюсь, если кто-то захочет повторить действия из второй главы для эмулятора ARM Raspberry, то можете написать, сколько времени происходит у Вас сборка qmake и этап конфигурирования с указанием вашего процессора в комментариях.

Спасибо за внимание. Удачи Вам в творчестве!

© Habrahabr.ru