Собираем приложение Qt в WebAssembly в Windows

2vruwlzn5xvqonnbrju4xfdatfs.png

Как известно, приложения написанные на Qt, который является кросс платформенными запускаются от desktop, мобильных, интернет вещей, до микроконтроллеров.

Один из вариантов это сборка приложения Qt в WebAssembly — которое позволит Вам запускать его в браузере у пользователя. Таким образом обновление приложения для пользователя будет заключаться в загрузке на сервер нового файла wasm.

Чтобы легче было осуществлять деплой приложения, в рамках данной статьи давайте соберём приложение Qt в WebAssmbly под Windows в командной строке.

В статье использована версия Qt 5.13.2 и я считаю, что у пользователя в Windows среда Qt установлена, настроена, и приложения для Desktop он без проблем собирает.

Запускаем утилиту MaintenanceTool.exe и выбираем «Добавление или удаление компонентов» и ставим галочку у WebAssembly и ждём завершения установки.

eds9saafk20p2aq8icyhkz567fa.png

Создаём пустой проект, например в Qt Creator (Qt Stack-view) и сохраняем его.

Идем на официальную страницу документации Qt WASM.

Начинаем ставить esmdk. Скачиваем emscripten и распаковываем, например в c:\wasm

Запускаем командную строку (пуск выполнить cmd) и пытаемся установить его:

cd c:\emsdk
emsdk.bat install sdk-fastcomp-1.38.27-64bit


У нас ничего не происходит. И курсор уже находится на следующей строке. Что могло случиться? Давайте посмотрим, почему? Открываем файл блокнотом и видим:

zfem7g3qowujeln8bnqprb3g2uu.png

Нам нужен питон? Проверяем? Пишем в командной строке

c:\emsdk>python --version
"python" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.


Ну значит нам еще необходимо установить Python. Скачиваем и устанавливаем его. Не забудьте добавить галочку при устанговке «Add Python 3.8 to PATH»

zhsqdg097xt83hk9pd9bjycvjia.png

После загрузки и установки, закрываем командную строку и запускаем снова CMD. Проверяем:

c:\emsdk>python --version
Python 3.8.1


Устанавливаем emsdk и активируем окружение окружение для сборки:

emsdk.bat install sdk-fastcomp-1.38.27-64bit
emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit


Проверяем:

em++


Компилятор готов. Пора приступать к сборке нашего приложения. Посмотрим в папку, где установлен Qt wasm: в моем случае он находится в C:\Qt\5.13.2\wasm_32

Запускаем командную строку с окружением для сборки Mingw: Пуск mingw — выбираем Qt 5.13.2 (MinGW 7.3.0 32-bit)

В ней активируем наш emsdk:

c:\emsdk\emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit


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

cd c:\Project\test-wasm
qmake
"qmake" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Что-то пошло не так? Я как-то не правильно активировал строку и окружение для сборки? Закроем командную строку и снова её запустим: Пуск mingw — выбираем Qt 5.13.2 (MinGW 7.3.0 32-bit) и проверим, что qmake есть у нас:

Setting up environment for Qt usage...

C:\Qt\5.13.2\mingw73_32>qmake --version
QMake version 3.1
Using Qt version 5.13.2 in C:/Qt/5.13.2/mingw73_32/lib


Все хорошо, окружение Qt активировано и qmake работоспособно. Пробуем снова активировать emsdk и получаем ту же самую ошибку.

Ну хорошо, подумал я, можно же сделать и подругому: сначала запустим emsdk, а потом активируем окружение mingw — для этого нам надо посмотреть ярлык запуска консоли с окружением mingw32 (пуск выполнить mingw — правая кнопка открыть расположение файла — правой кнопкой мыши на «Qt 5.13.2 (MinGW 7.3.0 32-bit)» — свойства.

9s5pj2xg81ww4yavpaocmchv1ti.png

В объекте нас интересует путь к запуску bat файла. В моём случае это C:\Qt\5.13.2\mingw73_32\bin\qtenv2.bat

Итак начинаем всё сначала. Пуск выполнить cmd

c:\emsdk\emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit
C:\Qt\5.13.2\mingw73_32\bin\qtenv2.bat
qmake --version


работает… идём в папку с исходным кодом проекта

qmake
make
"make" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Вспоминаем, что мы используем mingw и в ней команда для сборки другая:
mingw32-make.exe

mingw32-make


Приложение собралось, но проверям, что было использовано:

g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\test-wasm.exe release/main.o release/qrc_qml.o  C:\Qt\5.13.2\mingw73_32\lib\libQt5Quick.a C:\Qt\5.13.2\mingw73_32\lib\libQt5Gui.a C:\Qt\5.13.2\mingw73_32\lib\libQt5Qml.a C:\Qt\5.13.2\mingw73_32\lib\libQt5Network.a C:\Qt\5.13.2\mingw73_32\lib\libQt5Core.a  -lmingw32 C:\Qt\5.13.2\mingw73_32\lib\libqtmain.a -LC:\openssl\lib -LC:\Utils\my_sql\mysql-5.7.25-win32\lib -LC:\Utils\postgresql\pgsql\lib -lshell32
mingw32-make.exe[1]: Leaving directory 'c:/Project/test-wasm'

Так. Стоп? Что мы собрали?

Мы же собрали обычное 32 битное приложение для desktop (x86) потому что у нас использовалась сборка C:\Qt\5.13.2\mingw73_32

А нам нужно было собрать WASM. Давайте подкорректируем окружение PATH, чтобы он брал сначала путь и qmake из папки wasm:

set PATH=c:\Qt\5.13.2\wasm_32\bin;%PATH%


Очищаем папку от собранных файлов

mingw32-make.exe clean
del .qmake.stash


Запускаем сборку

qmake


cznx3sfjy_1b4svadrdfr2uac9m.png

Что такое? Опять ошибка? Что за dll нам нужна? Давайте ее поищем в папке, где установлен Qt:
Разве такое может быть? 32 битный собранный WASM (c:\Qt\5.13.2\wasm_32\bin) использует библиотеку от 64 битного MINGW?

kdk_mydgdcxxqogigkfjbt157wo.png

Ну допустим, можно и рискнуть, добавить путь до этой 64 битной библиотеки:

set PATH=c:\qt\5.13.2\mingw73_64\bin;%PATH%
mingw32-make.exe clean
qmake
mingw32-make.exe


и… куча ошибок

подробнее
release/main.o:main.cpp:(.text+0x1bc): undefined reference to `_imp___ZN4QUrlD1Ev'
release/main.o:main.cpp:(.text+0x1c6): undefined reference to `_imp___ZN11QMetaObject10ConnectionD1Ev'
release/main.o:main.cpp:(.text+0x1d7): undefined reference to `_imp___ZN21QQmlApplicationEngine4loadERK4QUrl'
release/main.o:main.cpp:(.text+0x1e0): undefined reference to `_imp___ZN15QGuiApplication4execEv'
release/main.o:main.cpp:(.text+0x1ef): undefined reference to `_imp___ZN21QQmlApplicationEngineD1Ev'
release/main.o:main.cpp:(.text+0x1f8): undefined reference to `_imp___ZN15QGuiApplicationD1Ev'
release/main.o:main.cpp:(.text+0x225): undefined reference to `_imp___ZN10QArrayData10deallocateEPS_jj'
release/main.o:main.cpp:(.text+0x249): undefined reference to `_imp___ZN21QQmlApplicationEngineD1Ev'
release/main.o:main.cpp:(.text+0x252): undefined reference to `_imp___ZN15QGuiApplicationD1Ev'
release/main.o:main.cpp:(.text+0x276): undefined reference to `_imp___ZN10QArrayData10deallocateEPS_jj'
release/main.o:main.cpp:(.text+0x28f): undefined reference to `_imp___ZN4QUrlD1Ev'
release/main.o:main.cpp:(.text+0x2aa): undefined reference to `_imp___ZN4QUrlD1Ev'
release/qrc_qml.o:qrc_qml.cpp:(.text+0x23): undefined reference to `qUnregisterResourceData(int, unsigned char const*, unsigned char const*, unsigned char const*)'
release/qrc_qml.o:qrc_qml.cpp:(.text+0x53): undefined reference to `qRegisterResourceData(int, unsigned char const*, unsigned char const*, unsigned char const*)'
release/qrc_qml.o:qrc_qml.cpp:(.text+0x83): undefined reference to `qUnregisterResourceData(int, unsigned char const*, unsigned char const*, unsigned char const*)'
release/qrc_qml.o:qrc_qml.cpp:(.text.startup+0x23): undefined reference to `qRegisterResourceData(int, unsigned char const*, unsigned char const*, unsigned char const*)'

C:/Qt/Tools/mingw730_32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile.Release:66: release/test-wasm.exe] Error 1
mingw32-make[1]: Leaving directory 'c:/Project/test-wasm'
mingw32-make: *** [Makefile:38: release] Error 2


Почему столько ошибок? Почему не собралось? Я же почистил временные файлы, запустил сборку, и получил так много error.

Так, надо подумать, налить чашку чая/кофе…

Точно! Идея! Т.к. видимо мы прописали последним путь к 64 битным библиотекам, то следовательно при сборке 32 разрядного WASM он не понял, как и что линковать, и пытался использовать путь к 64 битным lib, а значит мне надо было указать путь до 32 битных lib раньше, чем до 64 битных. Попробую исправить:

Закрываем консоль. Открываем снова mingw 32-bit и тут меня посещает мысль: т.к. мы запустили уже командную строку для mingw 32 бит, то заменив путь до библиотек на 64 битные, мы снова сделаем приоритет при сборке на 64 битные компоненты Desktop окружения Qt, а нам надо наоброт (т.к. сначала будет использоваться PATH до 64 битных, а затем до 32 итных библиотек). Ну тогда у нас итоговый алгоритм будет такой:

cmd
c:\emsdk\emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit

set PATH=c:\qt\5.13.2\mingw73_64\bin;%PATH%
qmake --version
QMake version 3.1
Using Qt version 5.13.2 in C:/qt/5.13.2/mingw73_64/lib


добавляем путь до wasm и идём собирать:

set PATH=c:\Qt\5.13.2\wasm_32\bin;%PATH%
cd c:\Project\test-wasm

c:\Project\test-wasm>qmake --version
QMake version 3.1
Using Qt version 5.13.2 in C:/Qt/5.13.2/wasm_32/lib
qmake
mingw32-make
"mingw32-make" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Опять 25! А сейчас то что у меня не так? Где вообще этот файл? Куда делся? Поиски в проводнике говорят что он находится в C:\Qt\Tools\mingw730_32\bin

Ну хорошо, mingw32-make.exe теперь точно у нас будет найден:

set PATH=C:\Qt\Tools\mingw730_32\bin;%PATH%


Начинаем собирать:

c:\Project\test-wasm>mingw32-make
c:\Qt\5.13.2\wasm_32\bin\qmake.exe -o Makefile test-wasm.pro
Info: creating stash file C:\Project\test-wasm\.qmake.stash
sed -e s/@APPNAME@/test-wasm/g C:/Qt/5.13.2/wasm_32/plugins/platforms/wasm_shell.html > C:/Project/test-wasm/test-wasm.html
"sed" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
mingw32-make: *** [Makefile:424: apphtml] Error 1


sed? Это же не Linux, Mac, *nix, *BSD. Где его взять? Поищем (sed.exe)?… И не находим.

Берем интернет, ищем (sed download windows) и находим, что его можно скачать для Windows:

Скачиваем binaries Zip, распаковываем из папки bin/sed.exe и запускаем:

p1bulgzwobzdf8i6d65rdpqdelc.png

p1bulgzwobzdf8i6d65rdpqdelc.png

Две ошибки на недостающие компоненты dll. Нам что теперь еще и sed надо будет самим собирать из исходников или искать эти отсутствующие dll? Нет, такого бы не хотелось делать… Еще раз внимательнее смотрим сайт GNU и видим в Downloads: • Complete package, except sources Setup

Скачиваем, распаковываем и устанавливаем. Пробуем запустить:

"c:\Program Files (x86)\GnuWin32\bin\sed.exe"


Работает!!! Осталось добавить его снова в путь:

set PATH="c:\Program Files (x86)\GnuWin32\bin";%PATH%
mingw32-make


Процессор загрузился, сборка началась. Ну вот, надеюсь, что теперь у нас все получится!

Прошло… минут

emcc: warning: cannot represent a NaN literal '0x22748a2c570' with custom bit pattern in NaN-canonicalizing JS engines (e.g. Firefox and Safari) without erasing bits!
  in   ret double 0x7FF4000000000000 in _ZL7qt_snanv()
emcc: warning: cannot represent a NaN literal '0x22748a2c570' with custom bit pattern in NaN-canonicalizing JS engines (e.g. Firefox and Safari) without erasing bits!
  in   ret double 0x7FF4000000000000 in _ZL7qt_snanv.30589()

c:\Project\test-wasm>dir
...
25.01.2020  17:42             2 922 test-wasm.html
25.01.2020  17:55           355 725 test-wasm.js
25.01.2020  14:59               461 test-wasm.js_plugin_import.cpp
25.01.2020  16:23             4 384 test-wasm.js_plugin_import.obj
25.01.2020  15:49               601 test-wasm.js_qml_plugin_import.cpp
25.01.2020  16:23             4 668 test-wasm.js_qml_plugin_import.obj
25.01.2020  14:52             1 099 test-wasm.pro
25.01.2020  15:25            22 523 test-wasm.pro.user
25.01.2020  17:55        20 759 738 test-wasm.wasm


Ура! Получилось. Наше тестовое приложение собралось. Бинарь wasm занимает 20 Мб. Не мало. Давайте попробуем открыть в браузере файл наш test-wasm.htm и…

2vruwlzn5xvqonnbrju4xfdatfs.png

Подведу итоги, как нужно собирать приложение Qt для 5.13.2 в Windows:

1. Необходимо установить Python. GNU SED и установить бинарные сборки WebAssembly через online installed Qt

2.

c:\emsdk\emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit
set PATH="c:\Program Files (x86)\GnuWin32\bin";%PATH%
set PATH=c:\qt\5.13.2\mingw73_64\bin;%PATH%
set PATH=C:\Qt\Tools\mingw730_32\bin;%PATH%


Но Хабр не был бы Хабром, если бы я не попробовал собрать приложение WebAssembly и из последней версии Qt, которая имеется в настоящий момент 5.14.0. Надеюсь, меня дальше не будет ожидать точно такой же квест, как при сборке в версии 5.13.2.

Через онлайн инсталлер (MaintenanceTool.exe) ставим Qt WebAssembly для версии 5.14.0. Конфигурируем окружение и запускаем сборку.

Процесс идёт и…

ztzhb07vfti-eekm3krpb5v-u1q.png

Ничего не понятно. Как это? Для версии 5.13.2, я после танцев с бубном, смог собрать приложение, а для 5.14.0 это не получилось? А как же тогда они (Qt) собрали его?

… А мы же тоже можем собрать WASM Qt 5.14.0 из исходников? А почему бы и нет. Для этого нам требуется много места на жёстком диске, а так же хорошая нагрузка/загрузка для процессора:

echo PATH=c:\qtwasm514\bin;"C:\Program Files (x86)\GnuWin32\bin";c:\qt\Tools\mingw730_32\bin;%PATH%
c:\emsdk\emsdk.bat activate --embedded sdk-fastcomp-1.38.27-64bit
cd c:\Qt\5.14.0\Src
configure.bat -no-warnings-are-errors -xplatform wasm-emscripten -platform win32-g++ -nomake examples -prefix c:\qtwasm


В данном случае после сборки у нас будет установлен wasm в папку c:\qtwasm, и ещё нам не нужно собирать примеры (examples).

Вывод конфигурирования
Building on: win32-g++ (i386, CPU features: none)
Building for: wasm-emscripten (wasm, CPU features: none)
Target compiler: clang 6.0.1
Configuration: cross_compile largefile release c++11 no-pkg-config reduce_exports static stl
Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. no
  Using C standard ....................... C11
  Using C++ standard ..................... C++11
  Using ccache ........................... no
  Using precompiled headers .............. no
  Using LTCG ............................. no
  Target compiler supports:
  Build parts ............................ libs
Qt modules and options:
  Qt Concurrent .......................... no
  Qt D-Bus ............................... no
  Qt D-Bus directly linked to libdbus .... no
  Qt Gui ................................. yes
  Qt Network ............................. yes
  Qt Sql ................................. no
  Qt Testlib ............................. yes
  Qt Widgets ............................. yes
  Qt Xml ................................. yes
Support enabled for:
  Using pkg-config ....................... no
  udev ................................... no
  Using system zlib ...................... no
  Zstandard support ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ no
  GLib ................................... no
  iconv .................................. yes
  ICU .................................... no
  Built-in copy of the MIME database ..... yes
  Tracing backend ........................ none
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  Using system PCRE2 ..................... no
Qt Network:
  getifaddrs() ........................... no
  IPv6 ifname ............................ no
  libproxy ............................... no
  OpenSSL ................................ no
    Qt directly linked to OpenSSL ........ no
  OpenSSL 1.1 ............................ no
  DTLS ................................... no
  OCSP-stapling .......................... no
  SCTP ................................... no
  Use system proxies ..................... yes
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ no
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ no
  Fontconfig ............................. no
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... no
    PNG .................................. yes
      Using system libpng ................ no
  EGL .................................... yes
  OpenVG ................................. no
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ no
    OpenGL ES 3.1 ........................ no
    OpenGL ES 3.2 ........................ no
  Vulkan ................................. no
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. no
  libinput ............................... no
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. no
  xkbcommon .............................. no
  X11 specific:
    XLib ................................. no
    XCB Xlib ............................. no
    EGL on X11 ........................... no
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. no
  LinuxFB ................................ no
  VNC .................................... yes
  Mir client ............................. no
Qt Sql:
  SQL item models ........................ yes
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... no
Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... no
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no
Qt Testlib:
  Tester for item models ................. yes
Qt SerialBus:
  Socket CAN ............................. no
  Socket CAN FD .......................... no
  SerialPort Support ..................... no
Further Image Formats:
  JasPer ................................. no
  MNG .................................... no
  TIFF ................................... yes
    Using system libtiff ................. no
  WEBP ................................... yes
    Using system libwebp ................. no
Qt QML:
  QML network support .................... yes
  QML debugging and profiling support .... yes
  QML tracing JIT support ................ no
  QML sequence object .................... yes
  QML list model ......................... yes
  QML XML http request ................... yes
  QML Locale ............................. yes
  QML delegate model ..................... yes
Qt Quick:
  Direct3D 12 ............................ no
  AnimatedImage item ..................... yes
  Canvas item ............................ yes
  Support for Qt Quick Designer .......... yes
  Flipable item .......................... yes
  GridView item .......................... yes
  ListView item .......................... yes
  TableView item ......................... yes
  Path support ........................... yes
  PathView item .......................... yes
  Positioner items ....................... yes
  Repeater item .......................... yes
  ShaderEffect item ...................... yes
  Sprite item ............................ yes
Qt Scxml:
  ECMAScript data model for QtScxml ...... yes
Qt Gamepad:
  SDL2 ................................... no
Qt 3D GeometryLoaders:
  Autodesk FBX ........................... no
Qt Wayland Client ........................ no
Qt Wayland Compositor .................... no
Qt Bluetooth:
  BlueZ .................................. no
  BlueZ Low Energy ....................... no
  Linux Crypto API ....................... no
  WinRT Bluetooth API (desktop & UWP) .... no
  WinRT advanced bluetooth low energy API (desktop & UWP) . no
Qt Sensors:
  sensorfw ............................... no
Qt Quick Controls 2:
  Styles ................................. Default Fusion Imagine Material Universal
Qt Quick Templates 2:
  Hover support .......................... yes
  Multi-touch support .................... yes
Qt Positioning:
  Gypsy GPS Daemon ....................... no
  WinRT Geolocation API .................. no
Qt Location:
  Qt.labs.location experimental QML plugin . yes
  Geoservice plugins:
    OpenStreetMap ........................ no
    HERE ................................. yes
    Esri ................................. yes
    Mapbox ............................... yes
    MapboxGL ............................. no
    Itemsoverlay ......................... yes
QtXmlPatterns:
  XML schema support ..................... yes
Qt Multimedia:
  ALSA ................................... no
  GStreamer 1.0 .......................... no
  GStreamer 0.10 ......................... no
  Video for Linux ........................ no
  OpenAL ................................. no
  PulseAudio ............................. no
  Resource Policy (libresourceqt5) ....... no
  Windows Audio Services ................. no
  DirectShow ............................. no
  Windows Media Foundation ............... no
Qt Tools:
  QDoc ................................... no
Qt WebEngineCore:
  Qt WebEngine Widgets ................... yes
  Qt WebEngine Qml ....................... yes
  Embedded build ......................... yes
  Full debug information ................. no
  Pepper Plugins ......................... no
  Printing and PDF ....................... no
  Proprietary Codecs ..................... no
  Spellchecker ........................... yes
  Native Spellchecker .................... no
  WebRTC ................................. no
  Use System Ninja ....................... no
  Geolocation ............................ yes
  WebChannel support ..................... yes
  Use v8 snapshot ........................ yes
  Kerberos Authentication ................ no
  Extensions ............................. no
  Support qpa-xcb ........................ no
  Building v8 snapshot supported ......... yes
  Use ALSA ............................... no
  Use PulseAudio ......................... no
  Optional system libraries used:
    re2 .................................. no
    icu .................................. no
    libwebp, libwebpmux and libwebpdemux . no
    opus ................................. no
    ffmpeg ............................... no
    libvpx ............................... no
    snappy ............................... no
    glib ................................. no
    zlib ................................. no
    minizip .............................. no
    libevent ............................. no
    jsoncpp .............................. no
    protobuf ............................. no
    libxml2 and libxslt .................. no
    lcms2 ................................ no
    png .................................. no
    JPEG ................................. no
    harfbuzz ............................. no
    freetype ............................. no
  Required system libraries:
    fontconfig ........................... no
    dbus ................................. no
    nss .................................. no
    khr .................................. no
    glibc ................................ no
  Required system libraries for qpa-xcb:
    x11 .................................. no
    libdrm ............................... no
    xcomposite ........................... no
    xcursor .............................. no
    xi ................................... no
    xtst ................................. no
Qt WebEngineQml:
  UI Delegates ........................... yes
  Test Support ........................... no

Note: Using static linking will disable the use of dynamically
loaded plugins. Make sure to import all needed static plugins,
or compile needed modules into the library.

Note: No wayland-egl support detected. Cross-toolkit compatibility disabled.

Note: The following modules are not being compiled in this configuration:
    serialport
    3dcore
    3drender

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.

WARNING: host pkg-config not found

Qt is now configured for building. Just run 'mingw32-make'.
Once everything is built, you must run 'mingw32-make install'.
Qt will be installed into 'c:\qtwasm'.

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


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

mingw32-make
mingw32-make install


После того, как я пересобрал WASM Qt 5.14.0 и установил в папку c:\qtwasm и использовал этот путь, я смог собрать WebAssembly из 5.14.0 версии Qt.

Вывод 2.


Если хотите использовать Qt 5.14.0 WebAssembly, вам потребуется его пересобрать из исходников и использовать уже собранную вами версию.

Заключение


Qt WebAssembly достаточно интересная технология, которая появилась в Qt начиная с версии 5.12.

Примеры WebAssembly можно посмотреть онлайн на сайте Qt.

Однако при попытке сборки собственного проекта, я получил ошибки:

glintm9_aahtojefsodha0ntaz4.png

Поэтому при использованиии данной технологии обязательно нужно изучать о её ограничениях.

Сейчас не поддерживаются модули: qtmultimedia, qtwebview.

В настоящий момент WebAssembly работает в большей части в Desktop браузерах, а когда появится полная поддержка в мобильных устройствах не известно.

Для тех, кто дочитал до конца данную статью, но еще ни разу не пробовал Qt, Вы можете скачать онлайн установщик, выбрать опции MinGW и нужную версию Qt WebAssmbly. QtCreator установится по умолчанию и Вы сможете собрать своё первое приложение.

В завершении данной статьи я бы хотел бы рекомендовать пользователям попробовать собрать примеры из исходников Qt, из папки Src\qtcharts\examples и запустить их в браузере.

Чтобы запустить веб сервер можно использовать Python, и выполнить:
python -m http.server 8000 --bind 192.168.0.10 если у вас адрес в локальной сети у компьютера 192.168.0.10. Так же не забудьте открыть порт в Firewall и тогда можно пробовать с другого компьютера/устройства/смартфона открыть приложение через браузер.

Голосуйте, и приводите свои примеры использования лучшего GUI фреймворка для C++ Qt в комментариях.

Удачного Вам творчества и новых достижений!

© Habrahabr.ru