По-умолчанию приложение в Qt линкуется динамически с библиотеками Qt, поэтому при распространении приложения необходимо поставлять и множество библиотек Qt.
Но можно собрать приложение в виде одного исполняемого файла, для которого не нужно дополнительных dll-ок.

Для сборки необходимы:

  • Qt 5.8.0 с включенными компонентами (если Qt уже был установлен, нужные компоненты можно установить с помощью Qt Maintenance Tool):
    Qt — Qt 5.8 — MinGW 5.3.0 32 bit
    Qt — Qt 5.8 — Sources
    Qt — Tools — MinGW
  • Perl (Strawberry Perl, к примеру). Я буду использовать strawberry-perl-5.24.1.1-32bit
    Проверить (открыв командную строку windows) что путь к исполняемому файлу Perl прописан в переменной окружения PATH.
  • Python 2 (2.7.5 и выше) — Необходим для сборки QtWebEngine в Qt 5.9.

Путь установки Qt был оставлен по-умолчанию: C:\Qt
Исходники Qt в этом случае будут находиться в директории C:\Qt\5.8\Src
Это не критично, путь может быть любой другой.

Копирую директорию с исходниками (C:\Qt\5.8\Src) в директорию C:\Qt\5.8-static\ (т.е., имеем копию исходников в папке C:\Qt\5.8-static\Src
Все дальнейшие действия производятся в ней.
Создаю директорию C:\Qt\5.8-static\mingw53_32 (в которой  будут собраны библиотеки Qt).
Редактирую файл C:\Qt\5.8-static\Src\qtbase\mkspecs\win32-g++\qmake.conf :
В самый конец файла (после строки с load(qt_config)) с новой строки добавляю строки:

QMAKE_LFLAGS += -static -static-libgcc
QMAKE_CFLAGS_RELEASE -= O2
DEFINES += UNICODE QT_STATIC_BUILD

Сохраняю.

Открываю командную строку MinGW, там ввожу:

set LANG=en
set QT_INSTALL_PREFIX="C:\Qt\5.8-static\mingw53_32"
cd /d %QT_INSTALL_PREFIX%\..\Src

И далее

configure.bat -static -debug-and-release -platform win32-g++ -prefix %QT_INSTALL_PREFIX% -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests -qt-sqlite -no-ssl

Тут стоит обратить внимание на опцию -no-ssl — это значит что Qt будет собран без поддежки SSL.
Если никаких ошибок нету, можно продолжать:

mingw32-make -k -j4

— очень длительный процесс.
Опцией -j указывается количество одновременно запущенных копий компилятора. Обычно по количеству ядер процессора.
По завершении процесса, если нету ошибок, делаем:

mingw32-make -k install

В результате получаем статическое окружение в C:\Qt\5.8-static\mingw53_32
Для версии Qt 5.9 просто заменяется 5.8 на 5.9.
Ну и наличие установленного Python2.7.x + пути к python.exe в PATH) — обязательно

 

23 комментарий для “Статическая линковка Qt 5.8.0 с MinGW32 в Windows”
  1. «Открываю командную строку MinGW, там ввожу:» Простите за глупость, это как?

    1. Есть такая.
      Вы при инсталляции Qt выбирали пунктик «Qt — Qt 5.8 — MinGW 5.3.0 32 bit» ?
      Если да, то… В русскоязычной версии Windows:
      Пуск -> Все программы -> Qt -> 5.8.0 -> MinGW 5.3.0 (32-bit) -> Qt 5.8.0 for Desktop (MinGW 5.3.0 32 bit)
      Для 5.9.* — всё то же самое, только 5.9.х вместо 5.8.х

      Либо просто вбив «MinGW» в строке поиска в меню «Пуск».

  2. пробую собрать версию 5.9.1 по вашему сценарию получаю :»D:/Programming/Qt_vs/5.9.1-static/Src/qtbase/qmake/library/qmakebuiltins.cpp:500:104: error: ‘_popen
    ‘ was not declared in this scope
    + QLatin1String(» && «) + args).toLocal8Bit().constData(), QT_POPEN_
    READ)) {

    ^
    D:/Programming/Qt_vs/5.9.1-static/Src/qtbase/qmake/library/qmakebuiltins.cpp:508:32: error: ‘_pclose
    ‘ was not declared in this scope
    int ec = QT_PCLOSE(proc);
    ^
    Makefile:217: recipe for target ‘qmakebuiltins.o’ failed
    mingw32-make: *** [qmakebuiltins.o] Error 1»

    1. Вы редактировали ранее qmake.conf, добавляя опции компилятора?
      Что говорит (опять же, в командной строке mingw) gcc -v и mingw32-make -v ?

  3. все заработало, косяк был в том что не из командной строки Mingw я это делал , потом вы написали я сделал это из командной строки Mingw и все заработало. СПАСИБО )

  4. Vlad, Может Вы подскажете? Пытаюсь делать с Qt5.9.3, на этапе теста конфигурации пишет «Checking for valid makespec… ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.» При этом в логе после перечисления опций конфига сказано:
    > Cannot read C:/Program1/Qt/Static5.9.3/src/qtbase/mkspecs/qmake.conf: ?? ??????? ????? ????????? ????.
    > Could not read qmake configuration file C:/Program1/Qt/Static5.9.3/src/qtbase/mkspecs/qmake.conf.
    > Error processing project file: C:\Program1\Qt\Static5.9.3\src\qtbase\config.tests\verifyspec\verifyspec.pro
    Ставлю из C:/Program1/Qt/Static5.9.3/src
    Не подскажите куда копать? Ранее собирал статические сборки не особо понимая все свои действия и вот попался…

    1. > Cannot read C:/Program1/Qt/Static5.9.3/src/qtbase/mkspecs/qmake.conf: ?? ??????? ????? ????????? ????.
      — судя по количеству знаков «?», там написано «не удается найти указанный файл» ))
      qmake.conf по указанному пути там присутствует? 🙂
      А какой тулчейн используется? Visual Studio? MinGW?

  5. Использую MinGW. Видимо, забыл указать какие-либо пути, что и вызвало ошибку. Но все стало хорошо после использования батника из http://wohlsoft.ru/pgewiki/Building_static_Qt_5 для «Qt 5.8 and higher» с заменой ключа -shared на -static. Все собралось и верно работает. Отсюда вопросы:
    Где можно посмотреть на допустимые ключи/опции команды configure.exe ? У Вас и в указанном батнике они различаются.
    Есть опции начигающиеся с -qt-…, или с -no-…, или просто -… В чем разница?

    1. configure.bat -help

      По -help будет список всех доступных ключей 🙂 Вот там есть и -qt-* и -no-*
      В том батнике у Вас ещё много разных -skip — это для пропуска ненужных (ненужных не для всех 🙂 ) компонентов типа Qt Serial Port, Qt Purchasing, и др., что видно из имени подмодулей \ компонентов после -skip.
      Список компонентов, которые можно скипнуть (некоторые зависимы друг от друга), можно найти в файле .gitmodules

  6. Vlad, спасибо!
    О хелпе знаю — писал вопрос как раз рассматривая вывод «configure.bat -help » )) Оттуда не следует, что ключ разрешения, например, надо задавать не -pcre, а -qt-pcre, и запрещать -no-pcre . Почему не -make -pcre и -skip -pcre, соответственно? Так понимаю, что для разных компонентов применяются разные способы обозначения? Тогда для кого как ? Вижу -skip -lib… для других -no-lib…, для отдельных компонентов есть режим — auto — по умолчанию они добавляются или исключаются, и если это не устраивает надо прописывать руками.
    Конечно это из-за моего незнания Qt. Скорее всего часть параметров взаимозависимы, что накладывает доп.условия при их применении. Пока нигде не нашел ясного указания зависимостей параметров configure. Может .gitmodules поможет. За указание на файлик .gitmodules отдельное спасибо. Он меняется только от версии к версии ?

  7. Не подскажете, как собрать Qt 5.8.0 c MinGW для создания 64-битных приложений в windows?

      1. Можно попросить Вас организовать статью с инструкциями по статической сборке qt 5.8.0 с помощью msvc для создания 64-битных приложений? В интернете есть решения, но видимо не совсем корректные и больше для старых версий qt, поэтому приходится бороться с ошибками, а это время.
        Спасибо.

  8. Хорошая инструкция ) На Qt 5.12.5 с MinGW 72_32 опробовано с небольшой корректировкой, всё отлично работает)

    1. Я все по инструкции сделал. Вроде как проблем не возникло. А как дальше быть? Как пользоваться?

  9. Храни тя госоподи братишка, я почти 5 лет кидал эти саные ддлки к ексешнику

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *