- PVSM.RU - https://www.pvsm.ru -

Руководство по сборке Qt под Windows из исходников с MinGW

Руководство по сборке Qt под Windows из исходников с MinGW - 1

Официальный способ установки готовых бинарников Qt - через онлайн инсталлятор. Однако он требует обязательной регистрации. Да еще и недоступен на территории РФ. Есть и другие [1]способы получить бинарники, или собрать с компилятором от Microsoft [2], однако не всегда эти способы приемлемы. Сборка из исходников под Windows может оказаться несколько нетривиальна для новичков, потому сделал небольшую инструкцию по сборке Qt 5 и Qt 6. А так же рассмотрена базовая настройка QT Creator.

Зачем Qt 5? Официальная поддержка Qt 5 закончилась неделю назад. В основном для поддержки (относительно) старых систем. Qt 6 больше не поддерживает 32-хразрядные ОС, не поддерживает Windows старше Windows 10 1809, и старые Linux которые все еще имеют расширенную коммерческую поддержку (Ubuntu 20.04 например). Qt 5 поддерживает Windows 7. Qt 5.6.3 - последняя официально поддерживающая Windows XP (его рассмотрим вскользь). Тем не менее, Qt 6, например, поддерживает Windows на Arm64, так что и он точно нужен.

Почему MinGW а не компилятор от Microsoft? В основном - из-за лицензии. Компилятор от Microsoft не является полностью свободным, и его нельзя использовать если нет лицензии на Visual Studio. Лицензия Community Edition - это тоже лицензия, но ее может использовать не каждый. Если годовая выручка (не прибыль) компании больше миллиона долларов за год, то использовать Community Edition нельзя! У MinGW есть и свои недостатки (например, WebEngine на нем не собирается), но это хороший компилятор.

Подготовка

Начнем. Сначала определимся что нужно в итоге получить. Нужна рабочая среда для создания приложений на Qt с поддержкой OpenSSL под Windows + документация + примеры. Процесс сборки тестировал на Windows 10 и Windows 11.

Начнем с Qt5, он более заморочный. Для сборки нужно свободное место. Компиляция Release сборки Qt 5.15.17 (последняя версия) требует чуть больше 8 Гб свободного места, потому я использовал RAM-диск чтоб не изнашивать SSD в ходе множества экспериментов. Ведь там больше трехсот тысяч файлов!

Для RAM-диска использовал ImDisk [3]- создал диск R: объемом 12 Гб (наверное, хватило бы и 10). Сам Qt можно скачать из множества зеркал. В статье я использую https://qt-mirror.dannhauer.de/ [4]

  • Качаем Qt 5.15.17 [5].

  • Компилятор. Для Qt 5 точно подходит MinGW 8.1. С более новыми сборка неуспешна. Самих вариантов сборок MinGW есть несколько (MSVCRT или UCRT, POSIX threads или MCF threads или WIN32 threads, SJLJ или SEH или DWARF). И не все успешно собирают Qt. Предлагаю не заморачиваться и скачать с зеркала: х32 [6] и х64 [7].

  • Еще (вроде бы) нужен Python 3 [8]. Качаем и ставим свежую версию, прописываем его в PATH. Думаю вы знаете как это делается.

  • Для сборки документации нужен CLang, но не всякий, а как-то хитро собранный. Скачаем с зеркала. Более того, версия новее чем 8.0 ломает процесс сборки. Да, Qt очень капризный. Берем 8.0: х32 [9] и х64 [10].

  • Чтобы работать с HTTPS (и не только) нужно подключить OpenSSL 3.0. Его сборка из исходников - тоже задачка нетривиальная. Скачаем готовое. Вот список [11]всяких сборок. Проверена (и далее рассматривается) сборка от FireDaemon [12].

  • QT Creator. Для Qt5 самая свежая подходящая версия - QT Creator 13. В более новых не работает нормально отладка в QT 5. Качаем собранную версию с GitHub [13].

  • CMake [14]. Для сборки Qt5 он не нужен, но пригодится для сборки проектов на его основе. К тому же он нужен для сборки Qt6. Сейчас уже есть версия 4, но с ней у меня были проблемы совместимости с другими проектами. Лучше поставим последнюю версию из ветки 3.

  • Также качаем, распаковываем куда-нибудь и прописываем в PATH Ninja [15].

Распаковка

Если не используете RAM-диск то замените везде R: на C:. Если хотите другие пути - сами везде меняйте в командах и скриптах.

Создадим структуру папок:

C:Qt
C:QtTools
C:Qt5.15.17
C:Qt5.15.17mingw81_32
C:Qt5.15.17mingw81_64
R:Qt
R:Qt5.15.17
  • Распаковываем компиляторы в C:QtTools. Будут подпапки mingw32 и mingw64. Переименуем их соответственно в mingw32_810 и mingw64_810. Полезно для разных версий компиляторов с разными Qt. В PATH их прописывать НЕ НАДО.

  • OpenSSL тоже распаковываем в C:QtTools. Создаст подпапку openssl-3.0.

  • Исходники Qt5 распаковал в R:Qt5.15.17. Создаст qt-everywhere-src-5.15.17. Переименовал в Src.

  • libclang распаковываем в C:QtTools, переименовываем в libclang_80_x32 и libclang_80_x64 для 32 и 64 битных версий соответственно.

  • Qt Creator я распаковал в C:Qt. Создаст QtCreator13. Возможно После распаковки понадобится скопировать из папки c:QtQtCreator13bin в папку c:QtQtCreator13binclangbin файлы libstdc++-6.dll , libwinpthread-1.dll , libgcc_s_seh-1.dll. А может и не понадобится, но в каком-то случае у меня Creator ругался что clangd не видит этих библиотек. Можно ярлычок от qtcreator.exe из папки c:QtQtCreator13bin себе куда-то бросить.

  • Так же нужно проверить что в путях (PATH) НЕТ sh.exe. Он, например, есть в Git и некоторых вариантах сборок MinGW (w64devkit например). Его наличие ломает процесс сборки.

Сборка

В этом примере собирать буду свободную версию, LGPL, без GPL библиотек, ибо их лицензия заразна, и их включение в проект по ошибке грозит лицензионными проблемами.

Для удобства создадим файл conf_qt5_x32.bat в папке R:Qt5.15.17Src следующего содержания:

MD  R:temp
SET TEMP=R:temp
SET TMP=R:temp
SET _ROOT=%cd%
SET _DST=C:/Qt/5.15.17/mingw81_32
SET PATH=c:QtToolsmingw32_810bin;%PATH%
SET PATH=%_ROOT%qtbasebin;%_ROOT%gnuwin32bin;%PATH%
set OPENSSL_ROOT_DIR=C:/Qt/Tools/openssl-3.0/x86
set OPENSSL_LIBDIR=C:/Qt/Tools/openssl-3.0/x86/lib
set OPENSSL_INCDIR=C:/Qt/Tools/openssl-3.0/x86/include

call configure.bat -shared -release -platform win32-g++^
 -opensource -confirm-license -prefix %_DST%^
 -docdir %_DST%/doc^
 -examplesdir %_DST%/examples^
 -I %OPENSSL_INCDIR% -L %OPENSSL_LIBDIR%^
 -opengl desktop -no-feature-d3d12^
 -no-avx -no-avx2 -no-avx512 -no-sse4.2 -no-sse4.1 -no-ssse3^
 -c++std c++1z^
 -nomake tests^
 -skip qtcharts,qtdatavis3d,qtvirtualkeyboard,qtnetworkauth^
 -skip qtlottie,qtquicktimeline,qtquick3d,qtwebglplugin^
 -skip qtwayland -skip qtwebengine

Обратите внимание, что использован обратный слэш для переменной PATH и прямой в остальных случаях.

Если вам не нужны примеры то добавьте -nomake examples в последнюю строку. Если хотите собрать с GPL библиотеками, то уберите две предпоследние строчки (где -skip qtcharts и -skip qtlottie). Для себя я решил их вообще не собирать, т.к. случайное включение даже одной из этих библиотек "заразит" GPL лицензией весь проект!

Немного описания
  • Параметр -shared значит что собираем динамические библиотеки. Это важное условие LGPL лицензии. Если вам нужна статическая линковка, то или проект должен быть под лицензией GPL, или нужно покупать коммерческую лицензию Qt.

  • Параметр -release значит что библиотека соберется в релиз-версии (спасибо, Кэп!). Если нужно отлаживать саму библиотеку Qt то можно сделать отладочную сборку (-debug) или двойную (-debug-and-release), тогда каждой релиз-версии DLL будет соответствовать отладочная DLL с дополнительной буквой "d" в конце имени. Но документация собирается только в релиз-версии! Для отладочной версии нужно минимум 23 Гб свободного места.

  • Параметр -platform win32-g++ помогает явно указать что мы хотим собирать через GCC (MinGw). Это может помочь в некоторых случаях избежать конфликтов компиляторов.

  • opensource значит что нет у нас купленной лицензии и собираем свободный вариант.

  • Чтоб не нужно было интерактивно соглашаться с лицензией добавлен параметр -confirm-license.

  • Параметр -prefix %_DST% указывает путь куда будет установлен Qt. При переносе на другие компы собранной библиотеки нужно переносить в тот же путь. Это не относится к программам, которые Вы создаете с Qt.

  • По умолчанию конфигурируется на работу с библиотекой ANGLE, что сломает процесс сборки если её нет, потому добавляем параметр -opengl desktop. Ну и -no-feature-d3d12 так же нужно для MinGW.

  • Наверняка программы будут создаваться не только для машины на которой собрана библиотека Qt, потому отключаем использование некоторых процессорных инструкций, которых может не быть у пользователя: -no-avx -no-avx2 -no-avx512 -no-sse4.2 -no-sse4.1 -no-ssse3

  • И будем использовать стандарт C++17: -c++std c++1z

  • Да и тесты библиотеки нам наверняка не нужны: -nomake tests

Дополнительно о параметрах можно почитать выполнив в папке Src команду configure --help. Так же много полезной информации есть в qtdocdocsrcplatformswindows.qdoc

Запустите CMD и перейдите в папку с исходниками (cd /d R:Qt5.15.17Src), запустите conf_qt5_x32.bat.

Должно сконфигурироваться. Проверьте подключился ли OpenSSL (OpenSSL ................................ yes), есть ли документация (QDoc ................................... yes), нет ли в конце сообщения что документация не будет собрана. Если что-то не так и нужно переконфигурировать, то удаляем .qmake.* и config.* из папки Src. Затем можно конфигурировать снова.

Собираем. Я использовал 9 потоков ( -j9 ), Вам может больше подойдет другое число:

mingw32-make -j9

Сборка длится долго (зависит от машины, от получаса до нескольких часов). Убеждаемся что сборка прошла без ошибок. Эта команда должна показать ноль:

echo %errorlevel%

Если были ошибки, то перед новой попыткой можно конечно сделать mingw32-make clean, но это выполнятся так долго, что значительно быстрее форматировать RAM-диск (или удалить папку Src если Вы не использовали RAM-диск) и распаковать заново.

Если же собралось хорошо, то устанавливаем:

mingw32-make -j9 install

Выполняется долго. Убедимся что всё успешно. Должны получить ноль:

echo %errorlevel%

Теперь собираем документацию:

SET PATH=c:QtToolslibclang_80_x32bin;%PATH% 
mingw32-make -j9 docs

И устанавливаем документацию:

mingw32-make -j9 install_docs

Готово! После всего можно добавить пару штрихов для удобства. Из папки c:QtToolsmingw32_810bin (или где там Ваш компилятор) копируем в c:Qt5.15.17mingw81_32bin эти файлы: libwinpthread-1.dll, libstdc++-6.dll, libgcc_s_dw2-1.dll. Эти файлы нужны будут во всяком приложении на Qt которое Вы будете собирать на этой библиотеке. Теперь можно запускать из папки c:Qt5.15.17mingw81_32bin приложения, такие как assistant, designer или linguist. Приложение assistant должно сразу подтянуть документацию. В эту же папку можно скопировать libcrypto-3.dll и libssl-3.dll из c:QtToolsopenssl-3.0x86bin. Это позволит без проблем запускать примеры программ, использующих HTTPS.

Qt 5 x64

Теперь бы еще 64х собрать. Закрываем CMD (так как там прописались пути для х32). Форматируем RAM-диск или удаляем Src и распаковываем исходники опять туда же. Это реально быстрее чем mingw32-make clean. Создадим файл conf_qt5_x64.bat в папке R:Qt5.15.17Src следующего содержания:

MD  R:temp
SET TEMP=R:temp
SET TMP=R:temp
SET _ROOT=%cd%
SET _DST=C:/Qt/5.15.17/mingw81_64
SET PATH=c:QtToolsmingw64_810bin;%PATH%
SET PATH=%_ROOT%qtbasebin;%_ROOT%gnuwin32bin;%PATH%
set OPENSSL_ROOT_DIR=C:/Qt/Tools/openssl-3.0/x64
set OPENSSL_LIBDIR=C:/Qt/Tools/openssl-3.0/x64/lib
set OPENSSL_INCDIR=C:/Qt/Tools/openssl-3.0/x64/include

call configure.bat -shared -release -platform win32-g++^
 -opensource -confirm-license -prefix %_DST%^
 -docdir %_DST%/doc^
 -examplesdir %_DST%/examples^
 -I %OPENSSL_INCDIR% -L %OPENSSL_LIBDIR%^
 -opengl desktop -no-feature-d3d12^
 -no-avx -no-avx2 -no-avx512 -no-sse4.2 -no-sse4.1 -no-ssse3^
 -c++std c++1z^
 -nomake tests^
 -skip qtcharts,qtdatavis3d,qtvirtualkeyboard,qtnetworkauth^
 -skip qtlottie,qtquicktimeline,qtquick3d,qtwebglplugin^
 -skip qtwayland -skip qtwebengine

Всё то же самое, только пути все для х64. Остальные команды те же (кроме путей):

mingw32-make -j9
mingw32-make -j9 install
SET PATH=c:QtToolslibclang_80_x64bin;%PATH%
mingw32-make -j9 docs
mingw32-make -j9 install_docs

После копируем из папки c:QtToolsmingw64_810bin в папку c:Qt5.15.17mingw81_64bin файлы: libwinpthread-1.dll, libstdc++-6.dll, libgcc_s_dw2-1.dll. В эту же папку можно скопировать libcrypto-3.dll и libssl-3.dll из c:QtToolsopenssl-3.0x64bin. Готово!

Настраиваем Qt Creator

  • Запускаем Qt Creator 13.

  • Идем Edit -> Preferences.

  • В категории Kits на вкладке Debuggers нажимаем Add.

  • Пишем имя (например, "GDB for Mingw 8.1 x32").

  • Выбираем путь к gdb.exe (в моем случае - C:QtToolsmingw32_810bingdb.exe).

Qt Creator 13 - Debuggers

Qt Creator 13 - Debuggers
  • Переходим на вкладку Compilers.

  • Add -> MinGW -> C.

  • Name: "MinGW 8.1 x32".

  • Compiler path: C:QtToolsmingw32_810bingcc.exe.

  • Add -> MinGW -> C++.

  • Name: "MinGW 8.1 x32".

  • Compiler path: C:QtToolsmingw32_810bing++.exe.

Qt Creator 13 - Compilers

Qt Creator 13 - Compilers
  • Вкладка Qt Versions.

  • Add.

  • Выбираем qmake.exe (C:Qt5.15.17mingw81_32binqmake.exe).

Qt Creator 13 - Qt Versions

Qt Creator 13 - Qt Versions
  • Нажомаем ОК. И... открываем опять Edit -> Preferences. Нужно было закрыть чтоб настройки применились.

  • Вкладка Kits.

  • Add.

  • Name: 5.15.17 x32.

  • Compiler C: "MinGW 8.1 x32".

  • Compiler C++: "MinGW 8.1 x32".

  • Debugger: "GDB for Mingw 8.1 x32".

  • Qt version: "Qt 5.15.17 (mingw81_32)".

  • OK.

Qt Creator 13 - Kits

Qt Creator 13 - Kits

Готово! Повторяем то же самое для х64 и можно работать.

Для Windows XP

Качаем Qt 5.6.3 [16] с официального сайта, так как на зеркалах такого уже нет. Компилятор MinGW 8.1 подходит, clang для документации вообще не нужен.

Конфигурация:

MD  R:temp
SET TEMP=R:temp
SET TMP=R:temp
SET _ROOT=%cd%
SET _DST=C:/Qt/5.6.3/mingw81_32
SET PATH=c:QtToolsmingw32_810bin;%PATH%
SET PATH=%_ROOT%qtbasebin;%_ROOT%gnuwin32bin;%PATH%

call configure.bat -shared -release -platform win32-g++^
 -opensource -confirm-license -prefix  %_DST%^
 -opengl desktop^
 -no-avx -no-avx2 -no-sse4.2 -no-sse4.1 -no-ssse3^
 -c++std c++1z^
 -target xp^
 -largefile^
 -nomake examples^
 -nomake tests^
 -skip qtwayland -skip qtwebengine

Сборка такая же:

mingw32-make -j9
mingw32-make -j9 install
mingw32-make -j9 docs
mingw32-make -j9 install_docs

Qt 6

Он огромен! Нужно порядка 50 Гб для сборки release версии и 75 Гб для Debug версии. RAM-диск такое может вместить только если у Вас много памяти. Тем не менее, сделать RAM-диск всё же будет полезно для temp. 1-2 Гб достаточно. Это снизит нагрузку на SDD.

  • Свежайшая версия на данный момент Qt 6.9.0 [17].

  • Qt Creator [18] можно свежайший взять.

  • Компилятор - MinGW 13.1 [19].

  • Для документации - LibCLang 20 [20]. Тестировал libCLang многих других вариантов, но они ломали процесс сборки.

  • Предполагаю что Вы уже поставили OpenSSL 3.0, CMake, Ninja - про них написал выше.

  • Эту версию Qt я собирал с ffmpeg [21].

Исходники распакуем в C:Qt6.9.0 и переименовываем в Src. Компилятор - в C:QtToolsmingw64_131. Libclang - в папку c:/Qt/Tools/libclang_201 ffmpeg - в папку C:QtTools.

Конфигурация:

MD  R:temp
SET TEMP=R:temp
SET TMP=R:temp
SET _ROOT=%cd%
SET _DST=C:/Qt/6.9.0/mingw131
SET _FFMPEG_DIR=C:/Qt/Tools/ffmpeg-n7.1-latest-win64-lgpl-shared-7.1
SET PATH=c:QtToolsmingw64_1310bin;%PATH%
SET PATH=%_ROOT%qtbasebin;%_ROOT%gnuwin32bin;%PATH%
set OPENSSL_ROOT_DIR=C:/Qt/Tools/openssl-3.0/x64
set OPENSSL_LIBDIR=C:/Qt/Tools/openssl-3.0/x64/lib
set OPENSSL_INCDIR=C:/Qt/Tools/openssl-3.0/x64/include

call configure.bat -shared -release -platform win32-g++^
 -opensource -confirm-license -prefix %_DST%^
 -docdir %_DST%/doc^
 -examplesdir %_DST%/examples^
 -ffmpeg-dir %_FFMPEG_DIR%^
 -opengl desktop^
 -no-avx -no-avx2 -no-sse4.2 -no-sse4.1 -no-ssse3^
 -c++std c++1z^
 -nomake tests^
 -skip qtcharts,qtdatavis3d,qtvirtualkeyboard,qtnetworkauth,qtlottie^
 -skip qtquicktimeline,qtquick3d,qtwebglplugin,qtmqtt,qtcoap^
 -skip qthttpserver,qtgraphs,qtgrpc,qtquick3dphysics^
 -skip qtwayland -skip qtwebengine

НЕ добавляйте clang в PATH - это сломает процесс сборки!

Не пугайтесь "WARNING: LLVM was found, but it was not built with RTTI support". Это нормально.

Собираем:

cmake --build . --parallel 
cmake --install .
SET LLVM_INSTALL_DIR=c:/Qt/Tools/libclang_201
cmake --build . --target docs
cmake --build . --target install_docs

Готово! Если нужно перенести сборку для создания программ на другуй машине - просто переносите всю папку Qt.

Заключение

Qt - замечательный инструмент. И хоть его сборка под Windows с MinGW несколько нетривиальна, но таким образом можно получить наиболее лицензионно чистую сборку и рабочую среду с самым свежим (насколько позволяют капризы Qt) компилятором и кастомным набором модулей.

Автор: yurix4

Источник [22]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/windows/422163

Ссылки в тексте:

[1] другие : https://habr.com/ru/articles/911260/

[2] Microsoft: https://habr.com/ru/articles/876802/

[3] ImDisk : https://sourceforge.net/projects/imdisk-toolkit/

[4] https://qt-mirror.dannhauer.de/: https://qt-mirror.dannhauer.de/

[5] Qt 5.15.17: https://qt-mirror.dannhauer.de/archive/qt/5.15/5.15.17/single/qt-everywhere-opensource-src-5.15.17.zip

[6] х32: https://qt-mirror.dannhauer.de/development_releases/prebuilt/mingw_32/i686-8.1.0-gdb-11.2.0-release-posix-dwarf-rt_v6-rev0.7z

[7] х64: https://qt-mirror.dannhauer.de/development_releases/prebuilt/mingw_64/x86_64-8.1.0-gdb-11.2.0-release-posix-seh-rt_v6-rev0.7z

[8] Python 3: https://www.python.org/downloads/

[9] х32: https://qt-mirror.dannhauer.de/development_releases/prebuilt/libclang/libclang-release_80-based-windows-mingw_32.7z

[10] х64: https://qt-mirror.dannhauer.de/development_releases/prebuilt/libclang/libclang-release_80-based-windows-mingw_64.7z

[11] список : https://github.com/openssl/openssl/wiki/Binaries

[12] FireDaemon: https://www.firedaemon.com/get-openssl

[13] GitHub: https://github.com/qt-creator/qt-creator/releases/tag/v13.0.2

[14] CMake: https://cmake.org/download/

[15] Ninja: https://github.com/ninja-build/ninja

[16] Qt 5.6.3: https://download.qt.io/new_archive/qt/5.6/5.6.3/single/qt-everywhere-opensource-src-5.6.3.zip

[17] Qt 6.9.0: https://qt-mirror.dannhauer.de/official_releases/qt/6.9/6.9.0/single/qt-everywhere-src-6.9.0.zip

[18] Qt Creator: https://github.com/qt-creator/qt-creator

[19] MinGW 13.1: https://qt-mirror.dannhauer.de/development_releases/prebuilt/mingw_64/MinGW-w64-x86_64-13.1.0-release-posix-seh-msvcrt-rt_v11-rev1.7z

[20] LibCLang 20: https://qt-mirror.dannhauer.de/development_releases/prebuilt/libclang/qt/libclang-llvmorg-20.1.0-windows-mingw_64.7z

[21] ffmpeg: https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n7.1-latest-win64-lgpl-shared-7.1.zip

[22] Источник: https://habr.com/ru/articles/917252/?utm_source=habrahabr&utm_medium=rss&utm_campaign=917252