
Официальный способ установки готовых бинарников 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: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).
-
Переходим на вкладку 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 Versions.
-
Add.
-
Выбираем qmake.exe (C:Qt5.15.17mingw81_32binqmake.exe).
-
Нажомаем ОК. И... открываем опять 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.
Готово! Повторяем то же самое для х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: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.
-
Qt Creator можно свежайший взять.
-
Компилятор - MinGW 13.1.
-
Для документации - LibCLang 20. Тестировал libCLang многих других вариантов, но они ломали процесс сборки.
-
Предполагаю что Вы уже поставили OpenSSL 3.0, CMake, Ninja - про них написал выше.
-
Эту версию Qt я собирал с ffmpeg.
Исходники распакуем в 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
