Статическая сборка Qt для Windows

Зачем?

Цель: научиться получать компактные EXE-файлы для Qt-программ под Windows. Для этого надо сделать статическую сборку Qt (в идеале - сделать её один раз) и использовать в своих проектах.

Именно из соображений компактности я ориентировался на Qt ветки 4.8. Перейти на Qt5 можно легко, она хорошо совместима с Qt4 по исходным текстом, но экзешник таким компактным уже не будет. :) Разумеется, если нужны свежие плюшки из Qt5 (например, Qt3D), придётся собрать именно её.

Простейшая сборка

Для начала, нам нужен компилятор. Я использовал 32-разрядный MinGW (gcc 4.4.0) из Qt SDK 2009.05, вы можете взять что-нибудь посвежее.

Далее, качаем с qt.io архив с исходниками Qt. У меня это qt-everywhere-opensource-src-4.8.6.zip. Распаковываем архив в каталог с не слишком страшным именем, желательно без русских букв. У меня это C:\Qt\4.8.6.st.

Далее медленно и печально идём в этот каталог (проверьте - configure.exe должен лежать именно там) и создаём командный файл для сборки. У меня он называется buildstat-486.bat и выглядит вот как:


SET QTDIR=c:\Qt\4.8.6.st
SET MINGWDIR=c:\Qt\2009.05\mingw
SET QMAKESPEC=win32-g++

SET PATH=%PATH%;%QTDIR%\bin;%MINGWDIR%\bin

configure -opensource -confirm-license -platform win32-g++ -static -release -no-exceptions -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -no-qt3support -no-phonon -no-webkit -nomake examples -nomake demos -prefix %QTDIR%
mingw32-make

Естественно, QTDIR, MINGWDIR и имя компилятора должны соответствовать вашим реалиям. MINGWDIR - это корневой каталог MinGW, внутри него должны находиться bin, lib, share и др.

Набор ключей можно и нужно корректировать под свои хотелки, у меня, например, выброшены примеры, работа с вебом, мультимедией и SQL. Некоторые ключи могут потребовать дополнительных библиотек, в частности, ключ -openssl подразумевает наличие отдельно собранного OpenSSL (см. ниже). Для просмотра списка возможных ключей сделайте configure.exe /? >configure-options.txt (он довольно большой).

Всё, запускаем наш батничек. Желательно из отдельной копии cmd, чтобы потом можно было посмотреть лог. Можно идти пить чай, а то и лечь спать - сборка вполне может занять 2-4 часа.

Если сборка прошла успешно, запускаем Qt Creator и подключаем нашу Qt, указав путь к её экземпляру qmake.exe.

Подключаем OpenSSL

Усложним задачу. Пусть мы активно работаем с сетью, и нам нужна поддержка OpenSSL (без него, например, в QNetworkAccessManager не будет работать протокол HTTPS).

Для Qt 4.8.6 я взял исходники openssl-1.0.2m (с более новыми версиями у Qt4 возможны проблемы). В отличие от самой Qt, просто так собрать его в Windows без дополнительных инструментов не получится. Я использовал MSYS 1.0.11, в качестве компилятора подключил всё тот же gcc 4.4.0. Если Вы предпочитаете свежие версии, будет проще - в современных версиях MSYS2 из коробки есть уже и компилятор, и пакетный менеджер, и многое другое. Впрочем, и у меня подключение компилятора делается просто - инсталлятор MSYS сам запрашивает путь к нему.

Закидываем исходники OpenSSL в дерево MSYS. У меня это C:\msys\1.0\home\username\projects (каталог projects я создал вручную, чтобы все исходники были в одном месте). Заходим в консоль MSYS, распаковываем исходники, переходим в распакованный каталог и собираем OpenSSL почти как в линуксе: :)


./config
make

Результатами нашей деятельности являются заголовочные файлы (include/openssl/*.h) и библиотечные файлы (libcrypto.a, libcrypto.pc, libssl.a и libssl.pc). Кладём их куда-нибудь, откуда их увидит MinGW при сборке Qt. (Скорее всего, их можно и в дереве MSYS оставить, не проверял). Модифицируем в файле buildstat-486.bat вызов configure примерно следующим образом:


configure -I "c:\Qt\3dparty\openssl-1.0.2m\include" -L "c:\Qt\3dparty\openssl-1.0.2m" -opensource -confirm-license -platform win32-g++ -static -release -no-exceptions -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -openssl -no-qt3support -no-phonon -no-webkit -nomake examples -nomake demos -prefix %QTDIR%

ВНИМАНИЕ! В каталоге, на который указывает -I, должен присутствовать подкаталог openssl, а уже в нём файлы *.h. Если Вы укажете напрямую путь к файлам *.h, Qt не соберётся. Запускаем батничек (вероятно, перед этим стоит почистить объектные файлы от предыдущей сборки) и терпеливо ждём результата.

Если ваши программы, работающие с HTTPS и/или SSL-сертификатами, нормально собираются и работают (мне, например, была нужна qwebdavlib) - значит, квест пройден.

Куда расти?

Для работы наших программ по-прежнему нужны библиотеки mingwm10.dll и libgcc_s_dw2-1.dll. Возможно, их тоже можно как-то слинковать статически, но как - я ещё не разобрался. Впрочем, они небольшие и погоды не делают.

Обсудить в блоге
М.З., 09.12.2017 - 20.01.2018, г. Циолковский
Viewable With Any Browser Пишите! В начало Designed by
Arachnophilia
Designed by Arachnophilia 4.0