Цель: научиться получать компактные 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 (без него, например, в 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, г. ЦиолковскийПишите! | Arachnophilia |