22 июля 2015 г.

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


    Пролистав всю документацию Qt, изучив не один десяток статей посвященных статической сборке библиотек Qt, так и не удалось найти тот единственно верный вариант настройки, который бы позволил мне без ошибок скомпилировать переносимое приложение Qt, без необходимости таскать с собой все библиотеки (mingw*.dll, libgcc*.dll, Qt*.dll).
    И лишь только собрав все рекомендации воедино, методом проб и ошибок удалось найти правильный алгоритм, который я попытаюсь в данной статье раскрыть.
    Но для начала, собственно, а зачем это все нужно?

    Что это такое и какие различия между статической и динамической сборкой?
    При компиляции программы использующей Qt со статической сборкой весь используемый qt-код вкладывается в исполняемый файл.
плюс: все находится в одном файле, не нужно с собой тащить файлы библиотек.
минус: большой размер исполняемого файла.
    При динамической сборке - используемый код Qt вызывается из отдельно хранимых библиотек, динамически подгружая необходимые программе классы.
плюс: маленький размер исполняемого файла.
минус: при распространении программы нужно тащить с собой файлы библиотек в дистрибутиве (если ранее Qt на целевом компьютере не было установлено).
    По умолчанию Qt компилируется с динамической сборкой, компиляция Qt со статической сборкой может порождать впоследствии некоторые проблемы, связанные с компиляцией модулей баз данных.
    Когда необходимо использовать статическую сборку?
    Когда хочется запустить созданное exe-приложение на компьютере, на котором библиотека Qt не установлена. И совсем не хочется наблюдать ошибку отсутствия необходимых приложению библиотек mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll.
    Что можно сделать, помимо статической сборки Qt, для запуска приложения вне среды Qt?
    Можно найти в папке Qt все требуемые библиотеки и положить их рядом с запускаемым exe-приложением (недостаток - придется для каждого создаваемого проекта копировать эти dll-файлы). Можно использовать для этого windeployqt.
    Можно прописать пути до этих библиотек в системную переменную PATH, но это будет работать только на том компьютере, где установлена библиотека Qt, и проделано данное действие.

    Цель создания статической сборки ясна. Теперь, что необходимо для этого сделать.

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

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

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

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

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

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

SET QTDIR=%QT_DIR%
SET PATH=%MinGW_DIR%\opt\bin;%MinGW_DIR%\bin;%QT_installed_DIR%;%PATH%

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

:: Запись в конфиг файл нужной строки, чтобы qt знал что компилируется статическое приложение и добавил в него все необходимые библиотеки
echo QMAKE_LFLAGS += -static -static-libgcc >> %QT_DIR%\mkspecs\win32-g++\qmake.conf

:: Configure, compile and install Qt.
configure -opensource -release ^
-static -platform win32-g++ ^
-nomake examples -nomake demos -nomake tools ^
-nomake translations -nomake docs -no-exceptions ^
-no-qt3support -no-scripttools -no-openssl -no-opengl ^
-no-dsp -no-webkit -no-phonon ^
-no-style-motif -no-style-cde -no-style-cleanlooks ^
-no-style-plastique ^
-no-script -no-scripttools -no-declarative

mingw32-make -j4 -k
mingw32-make install
mingw32-make -j4 -k clean
    Примечание:
    1. Параметры у configure выбраны те, которые удобны мне. По максимуму исключены все редко используемые опции, чтобы быстрей прошла компиляция и был уменьшен размер приложения. Возможно вам захочется изменить эти параметры, или вам просто необходимо узнать за что они отвечают, тогда вам сюда - описание параметров
configure (ENG и RUS).
    2. Параметр "-j4" у mingw32-make отвечает за то, на сколько потоков будет произведено распараллеливание компиляции (4 - 4 потока). Рекомендуется ставить число соответствующее количеству ядер компьютера.

4. Отключаем антивирус (иначе время компиляции увеличится втрое!). Запускаем командную строку от имени Администратора и в ней запустить данный bat-файл. Можно сходить выпить кофе/чай – это надолго.
     Сразу скажу, что не знаю, что считать результатом успешной сборки и какими строками должна завершаться данная установка, но у меня они следующие:


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


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

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

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


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


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

10. Всё. Qt настроен на статическую сборку приложения.
     Проверим это. Вновь откроем проект hello, с которым мы работали раньше. После открытия перейдем в меню Проекты:
    Примечание:
    Здесь и дальше я использую скриншоты для комплекта Qt 5.4.1 (Static). Не пугайтесь :)


11. Нажмем на кнопку Добавить и выберем в выпадающем списке только что созданную конфигурацию:


12. Увидим, что она добавилась, и перейдем обратно в Редактор:


13. Жмем на пиктограмму компьютера, в которой выбираем нужную нам конфигурацию (для переноса приложения на другой компьютер используется версия Release или Выпуск):


14. Теперь можно компилировать приложение и запускать его на ПК, где Qt не установлен. Где найти exe-файл было написано в предыдущей статье (C:\Qt\Projects\build-hello-Qt_4_8_7_Static-Release\release):

15. Для отладки использовать статическую конфигурацию не получится, и необходимо выбрать соответствующий пункт меню:

16. Я же обычно избавляюсь от лишней вложенности, удалив ненужные пункты настройки компиляции. Для этого нужно перейти в Проекты, выбрать ту конфигурацию, которая создает динамическое приложение, а в выпадающем списке изменения конфигурации выбрать нужный пункт Выпуск, и нажать кнопку Удалить. Тоже самое повторить для статической сборки:


17. В результате получаются всего две строки с выбором необходимой конфигурации сборки:

18. В дальнейшем при импорте проекта, можно произвести выбор выставив галочки напротив соответствующих пунктов. Например, так:

     Вот собственно и все, что я хотел рассказать в рамках этой статьи. Надеюсь она вам помогла. Не стоит забывать, что при использовании статической сборки вступает в силу лицензионное соглашение LPGL, которое не разрешает распространять программы без открытости их исходников в открытом доступе для всех (как-то так).
     В следующей статье ждите алгоритм для статической сборки Qt 5.4.1.

Используемый и полезный материал:
Installing Qt for Windows
Configuration Options for Qt
Building a static Qt for Windows using MinGW
Qt — статическая линковка библиотеки под Windows
Статическая сборка dll-библиотеки с модулями QtQuick
Статическая сборка Qt4.8 + OpenSSL
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll - C++ Qt

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

1 комментарий:

  1. Я видел комментарии людей, которые уже получили ссуду от г-на Бенджамина Ли, и я решил подать заявку в соответствии с их рекомендациями, и всего через 5 дней я подтвердил свою ссуду на моем банковском счете на общую сумму 850 000,00 долларов США, которую я запросил. Это действительно отличная новость, и я советую всем, кому нужен настоящий кредитор, подать заявку по электронной почте: 247officedept@gmail.com или WhatsApp: + 1-989-394-3740. Я счастлив, что получил ссуду, о которой просил.

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