Pull to refresh

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

Level of difficultyEasy
Reading time10 min
Views2.8K

Официальный способ установки готовых бинарников Qt - через онлайн инсталлятор. Однако он требует обязательной регистрации. Да еще и недоступен на территории РФ. Есть и другие способы получить бинарники, или собрать с компилятором от Microsoft, однако не всегда эти способы приемлемы. Сборка из исходников под 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 - создал диск R: объемом 12 Гб (наверное, хватило бы и 10). Сам Qt можно скачать из множества зеркал. В статье я использую https://qt-mirror.dannhauer.de/

  • Качаем Qt 5.15.17.

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

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

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

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

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

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

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

Распаковка

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

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

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

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

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

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

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

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

Сборка

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

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

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:\Qt\Tools\mingw32_810\bin;%PATH%
SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%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. Так же много полезной информации есть в \qtdoc\doc\src\platforms\windows.qdoc

Запустите CMD и перейдите в папку с исходниками (cd /d R:\Qt\5.15.17\Src), запустите 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:\Qt\Tools\libclang_80_x32\bin;%PATH% 
mingw32-make -j9 docs

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

mingw32-make -j9 install_docs

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

Qt 5 x64

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

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:\Qt\Tools\mingw64_810\bin;%PATH%
SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%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:\Qt\Tools\libclang_80_x64\bin;%PATH%
mingw32-make -j9 docs
mingw32-make -j9 install_docs

После копируем из папки c:\Qt\Tools\mingw64_810\bin в папку c:\Qt\5.15.17\mingw81_64\bin файлы: libwinpthread-1.dll, libstdc++-6.dll, libgcc_s_dw2-1.dll. В эту же папку можно скопировать libcrypto-3.dll и libssl-3.dll из c:\Qt\Tools\openssl-3.0\x64\bin. Готово!

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

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

  • Идем Edit -> Preferences.

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

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

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

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

  • Add -> MinGW -> C.

  • Name: "MinGW 8.1 x32".

  • Compiler path: C:\Qt\Tools\mingw32_810\bin\gcc.exe.

  • Add -> MinGW -> C++.

  • Name: "MinGW 8.1 x32".

  • Compiler path: C:\Qt\Tools\mingw32_810\bin\g++.exe.

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

  • Add.

  • Выбираем qmake.exe (C:\Qt\5.15.17\mingw81_32\bin\qmake.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 с официального сайта, так как на зеркалах такого уже нет. Компилятор 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:\Qt\Tools\mingw32_810\bin;%PATH%
SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%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.

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

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

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

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

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

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

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

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:\Qt\Tools\mingw64_1310\bin;%PATH%
SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%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) компилятором и кастомным набором модулей.

Tags:
Hubs:
+15
Comments18

Articles