Собираем приложение Qt в WebAssembly в Windows
Как известно, приложения написанные на Qt, который является кросс платформенными запускаются от desktop, мобильных, интернет вещей, до микроконтроллеров.
Один из вариантов это сборка приложения Qt в WebAssembly — которое позволит Вам запускать его в браузере у пользователя. Таким образом обновление приложения для пользователя будет заключаться в загрузке на сервер нового файла wasm.
Чтобы легче было осуществлять деплой приложения, в рамках данной статьи давайте соберём приложение Qt в WebAssmbly под Windows в командной строке.
В статье использована версия Qt 5.13.2 и я считаю, что у пользователя в Windows среда Qt установлена, настроена, и приложения для Desktop он без проблем собирает.
Запускаем утилиту MaintenanceTool.exe и выбираем «Добавление или удаление компонентов» и ставим галочку у WebAssembly и ждём завершения установки.
Создаём пустой проект, например в Qt Creator (Qt Stack-view) и сохраняем его.
Идем на официальную страницу документации Qt WASM.
Начинаем ставить esmdk. Скачиваем emscripten и распаковываем, например в c:\wasm
Запускаем командную строку (пуск выполнить cmd) и пытаемся установить его:
cd c:\emsdk
emsdk.bat install sdk-fastcomp-1.38.27-64bit
У нас ничего не происходит. И курсор уже находится на следующей строке. Что могло случиться? Давайте посмотрим, почему? Открываем файл блокнотом и видим:
Нам нужен питон? Проверяем? Пишем в командной строке
c:\emsdk>python --version
"python" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
Ну значит нам еще необходимо установить Python. Скачиваем и устанавливаем его. Не забудьте добавить галочку при устанговке «Add Python 3.8 to PATH»
После загрузки и установки, закрываем командную строку и запускаем снова 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)» — свойства.
В объекте нас интересует путь к запуску 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
Что такое? Опять ошибка? Что за dll нам нужна? Давайте ее поищем в папке, где установлен Qt:
Разве такое может быть? 32 битный собранный WASM (c:\Qt\5.13.2\wasm_32\bin) использует библиотеку от 64 битного MINGW?
Ну допустим, можно и рискнуть, добавить путь до этой 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 и запускаем:
Две ошибки на недостающие компоненты 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 и…
Подведу итоги, как нужно собирать приложение 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. Конфигурируем окружение и запускаем сборку.
Процесс идёт и…
Ничего не понятно. Как это? Для версии 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.
Однако при попытке сборки собственного проекта, я получил ошибки:
Поэтому при использованиии данной технологии обязательно нужно изучать о её ограничениях.
Сейчас не поддерживаются модули: 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 в комментариях.
Удачного Вам творчества и новых достижений!