22 июля 2015 г.

Статическая сборка Qt 5.4.1 с MinGW на Windows

     Все что касалось этой статьи о статической сборке Qt 4.8 относится и к Qt 5.4. Поэтому, чтобы не писать одно и тоже вступление, посмотрите его в той статье. Предлагаю сразу перейти к действию.
     Цель та же - хотим создавать переносимые приложения, но уже на Qt 5.4 под Windows с компилятором MinGW.
     Поехали!

Предварительные действия

1. Установить Qt 5.x.x c MinGW

Последовательность действий

1. Скачиваем исходники Qt последней версии (у меня 5.4.1)
    Найти их можно здесь:

2. Распаковываем скачанный архив, например, в C:\Qt\src
    Должно получиться так:

3. Создаем bat-файл (или скачиваем) в директории C:\Qt\src следующего содержания (поправьте пути, если указанные пути не устраивают):
:: Где лежат исходники?
SET QT_SRC=C:\Qt\src
:: Куда будем ставить?
SET QT_DIR=C:\Qt\Qt5.4.1_Static
:: Где установлен MinGW?
SET MinGW_DIR=C:\Qt\Qt5.4.1\Tools\mingw491_32

SET QTDIR=%QT_DIR%
SET QT_INSTALL_PREFIX=%QTDIR%
SET PATH=%MinGW_DIR%\opt\bin;%MinGW_DIR%\bin;%PATH%
IF NOT EXIST "%QTDIR%" (mkdir "%QTDIR%")

:: Запись в конфиг файл нужных строк
echo # [QT-STATIC-PATCH] >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf
echo QMAKE_LFLAGS += -static -static-libgcc >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf
echo QMAKE_LFLAGS += -static -static-libgcc  >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf
echo QMAKE_CFLAGS_RELEASE -= -O2 >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf
echo QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf
echo DEFINES += QT_STATIC_BUILD >> %QT_SRC%\qtbase\mkspecs\win32-g++\qmake.conf

:: Установка English локали чтобы избежать странных эффектов локализации
SET LANG="en"

:: Configure, compile and install Qt.
configure.bat -static -debug-and-release -platform win32-g++ -prefix %QTDIR% ^
-qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -qt-sql-sqlite -no-openssl ^
-opensource -confirm-license ^
-make libs -nomake tools -nomake examples -nomake tests

mingw32-make -k -j4
mingw32-make -k install

:: Запись в конфиг файл нужной строки, чтобы qt знал что компилируется статическое приложение и добавил в него все необходимые библиотеки
echo QMAKE_LFLAGS += -static -static-libgcc >> %QT_DIR%\mkspecs\win32-g++\qmake.conf
    Примечание:
    1. Параметры у configure выбраны те, которые предложены в этом руководстве Qt. Возможно вам захочется изменить эти параметры, или вам просто необходимо узнать за что они отвечают, тогда вам сюда - описание параметров
configure (ENG).
    2. Параметр "-j4" у mingw32-make отвечает за то, на сколько потоков будет произведено распараллеливание компиляции (4 - 4 потока). Рекомендуется ставить число соответствующее количеству ядер компьютера.
 
4. Отключаем антивирус (иначе время компиляции увеличится втрое!). Запускаем командную строку от имени Администратора и в ней запускаем данный bat-файл. Можно сходить выпить кофе/чай – это надолго.
     Если все правильно сделали, то папку с исходниками (C:\Qt\src) можно удалить.

5. Запускаем Qt Creator. Открываем Параметры. Открываем Сборка и запуск. И переходим на вкладку Qt Versions. Щелкаем кнопку Добавить:

6. Ищем скомпилированный новый qmake (C:\Qt\Qt5.4.1_Static\bin\):

7. Даем какое-нибудь имя новому профилю, например, Qt %{Qt:Version} (Static). Жмем Применить:

    Примечание:
    Библиотеки QML в данной сборке отсутствуют и поэтому появляется фраза “qmlscene не установлен”. В принципе, она работе не мешает, но если хотите ее убрать, то просто скиньте два файла (qmlscene.exe и qmlviewer.exe) в каталог Qt (где находится qmake). Взять их можно из динамической сборки Qt.


8. Переходим во вкладку Комплекты и жмем Добавить:


9. Придумываем имя новому комплекту. Выбираем созданный профиль. Остальное по умолчанию. Жмем Применить и ОК:

10. Всё. Qt настроен на статическую сборку приложения.

     Осталось лишь подключить данный комплект к проекту, который необходимо скомпилировать с использованием статической сборки Qt 5.4. А об этом, на примере проекта hello, я писал в своей предыдущей статье по статической сборке Qt 4.8 (пп. 10-18).

Используемый и полезный материал:
Статическая сборка Qt 4.8.7 с MinGW на Windows
Building a static Qt for Windows using MinGW
Qt Configure Options
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll - C++ Qt
Russian Qt Forum - Статическая сборка Qt 5.4 для Win 7
Статическая сборка dll-библиотеки с модулями QtQuick


При копировании статьи просьба указывать источник и автора.
С уважением, GRomR1.

7 комментариев:

  1. На версии 5.8.0 пишет "Perl not found in PATH. Aborting"

    ОтветитьУдалить
    Ответы
    1. Понятно.
      Тогда ставим Perl:
      https://www.perl.org/get.html#win32

      И пробуем уже с ним.

      Удалить
  2. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  3. Здравствуйте! Следовал указанным инструкциям, bat файл запустился успешно, но в конце работы вывелось сообщение: "no wayland-egl support detected. Cross-toolkit compatibility disabled." Плюс, в результате папка "Qt5.8.0_Static" абсолютно пуста. Что делать?

    ОтветитьУдалить
    Ответы
    1. Возможно что-то поменялось в Qt. Инструкция писалась 2 года назад.
      Но могу сказать, что вы не один с этой проблемой:
      http://www.prog.org.ru/index.php?topic=31307.0
      Наверняка, есть решение, но я его не знаю и помочь Вам в это не смогу.
      Воспользуйтесь гуглом =)
      Но спасибо за комментарий.

      Удалить
  4. Подскажите, скомпилил скриптом по умолчанию - получилось всего несколько библиотек. Остальные из сорцов в статические либы не скомпилились. В частности QtSerialPort. Почему это произошло? И как можно отдельно статически компильнуть QtSerialPort?

    ОтветитьУдалить
  5. К сожалению, не подскажу. Не знаю, как это сделать и почему не скомпилировались сторонние библиотеки как статические.

    ОтветитьУдалить