Всё в одном exe без зависимостей (статическая линковка в Qt 5.3.2)

в 0:59, , рубрики: Песочница, метки: , , , , ,

Программы, собранные на Qt требуют множество дополнительных файлов, таких как:

Qt5Widgets.dll
Qt5Gui.dll
Qt5Core.dll
libwinpthread-1.dll
libstdc++-6.dll
libgcc_s_dw2-1.dll
icuuc52.dll
Это далеко не полный список возможных зависимостей.

Как от них избавиться? Нужна статическая сборка Qt.

В интернете много разных статей на эту тему, но они мне не понравились по разным причинам. Поэтому я решил написать свою.

Протестировано для: Qt 5.3.2, компилятор MinGW 4.8.2 32bit, Windows 7 64bit. Написано на основе qt-project.org/wiki/How-to-build-a-static-Qt-for-Windows-MinGW но без использования Windows PowerShell.

Итак, нужно сделать следующее:

1. Скачать и установить обычную сборку Qt с официального сайта qt-project.org/downloads
Если Qt уже установлена, можно воспользоваться MaintenanceTool.exe
Важно в менеджере пакетов поставить галочку напротив MinGW 4.8.2 и Sourсe Components
Далее подразумевается, что Qt установлена в С:Qt
Если это не так, надо везде поменять пути на свои.

2. Проверить, что всё работает правильно
а) запустить Qt Creator, создать новый проект, собрать его, запустить;
б) закрыть Qt Creator и попробовать запустить *.exe отдельно от среды разработки;
в) убедиться в том, что программа требует кучу дополнительных библиотек;
г) закрыть всё, подумать о том, какая сложная штука — жизнь.
Теперь можно идти дальше.

3. Открыть файл С:Qt5.3Srcqtbasemkspecswin32-g++qmake.conf
На всякий случай можно сделать бэкап.
Добавить в конец файла (взято из windows-build-qt-static.ps1):
# Static
QMAKE_LFLAGS += -static -static-libgcc
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer
DEFINES += QT_STATIC_BUILD
CONFIG += static
# Static

Сохранить изменения и закрыть файл от греха подальше.

4. Создать пустую папку для статической сборки (C:Qt5.3static)
В принципе, она может быть где угодно, главное чтобы была пустая.
Создать в ней файл make.bat с таким содержанием:

:: !!!check path!!!
set QtDir=C:Qt5.3static
set MingwDir=C:QtToolsmingw482_32
set QtSrcDir=C:Qt5.3Src
set CMAKE_INCLUDE_PATH=%MingwDir%i686-w64-mingw32include
:: Set a clean path including MinGW.
set PATH=%PATH%;%MingwDir%bin;%MingwDir%optbin
:: Force English locale to avoid weird effects of tools localization.
set LANG=en
:: Set environment variable QT_INSTALL_PREFIX. Documentation says it should be
:: used by configure as prefix but this does not seem to work. So, we will
:: also specify -prefix option in configure.
set QT_INSTALL_PREFIX=%QtDir%
:: Configure, compile and install Qt.
cmd /c "%QtSrcDir%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" > log_cmd.txt
mingw32-make -k -j4 > log_make.txt
mingw32-make -k -j4 install > log_make_install.txt
pause

Проверить правильность всех путей. Это действительно важно.
Если всё правильно, сохранить и закрыть файл.

5. Открыть консоль cmd.exe и запустить make.bat
Этот процесс длится примерно час или два, в зависимости от скорости работы компьютера. Если всё завершилось через 5 минут или раньше, то что-то пошло не так.
В файлах log_cmd.txt, log_make.txt, log_make_install.txt можно почитать сообщения об ошибках.
У меня почему-то сначала компилятор не мог найти некоторые заголовочные файлы. Пришлось добавить это:
set CMAKE_INCLUDE_PATH=%MingwDir%i686-w64-mingw32include

6. Настроить Qt Creator.
Параметры -> Сборка и запуск -> Профили Qt -> Добавить
Выбрать файл С:Qt5.3staticbinqmake.exe
Название профиля: Qt (static)

Параметры -> Сборка и запуск -> Комплекты -> Добавить
Название: Static
Тип устройства: Desktop
Устройство: Локальный ПК
Sysroot: C:Qt5.3static
Компилятор: MinGW
Отладчик: Не задан
Профиль Qt: Qt (static)

Теперь в Qt Creator доступен комплект статической сборки.
Проекты -> Сборка и запуск -> добавить -> Static

7. В файле проекта (*.pro) добавить флаги
QMAKE_LFLAGS += -static -static-libgcc

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

Это всё. Осталось только пересобрать свой проект с новым комплектом. Теперь можно запускать скомпилированные exe-файлы на любом компьютере под управлением Windows 7 или Windows XP. На других системах не тестировалось.

Надо отметить, что в результате статической линковки размеры exe-файлов существенно возрастают. Например, изначально exe-файл занимал всего 1,38 МБ и требовал различных библиотек в сумме на 43,5 МБ. После описанных процедур он увеличился до 16,1 МБ. Но уже всё, что надо, у него есть.

Буду благодарен за отзывы, комментарии, сообщения об ошибках.

Поделиться

  1. Михаил:

    ничего не работает

* - обязательные к заполнению поля