Qt — статическая линковка библиотеки под Windows

Всем доброго времени суток, решил написать эту статью специально для тех кто хочет или еще захочет чтобы его программка написанная c помощью Qt под Windows работала даже там где о Qt и не слышали, на Хабре есть статья где данная проблема решается сопровождением нашего .exe библиотечками от skazkin. Сам очень долго искал решение этого вопроса, но практически везде об этом говорили говорили, но ничего действенного так и не получалось. В итоге собирая и анализируя все что приходило мне из разных источников, я наконец-то сделал это и если кому ещё интересно всех прошу под кат

Немного о себе. Ось моя Windows 7 (хотя был XP все тоже), библиотеки Qt 4.7.4 (если у Вас +- пару версий это нормально), Qtcreator 2.3.1 + компилятор MinGw. Сначала ставил Qt Creator, который с официального сайта можно скачать уже с компилятором MinGW (и не только его, а и все остальное), далее библиотеки.
Приступаем к самому интересному, допустим что всё уже установлено или поставилось:
1. Находим директорию куда мы установили нашу библиотеку, что то вроде C:\Qt\4.*.*\, а точнее в C:\Qt\4.*.*\mkspecs\win32-g++ (кстати никогда не используйте кириллицу в наименовании пути к любым файлам Qt, просто не делайте это) и находим там config-file qmake.conf , открываем блокнотиком и добавляем строку
QMAKE_LFLAGS += -static, я её поставил к остальным флажкам.

2. Теперь создаем .bat файл, причем неважно где с примерно следующим содержанием. Где первые две строки будут:
SET QTDIR=C:\Qt\4.7.4
SET PATH=C:\Qt\qtcreator-2.3.1\mingw\bin; C:\Qt\4.7.4\bin;%PATH%

Важно как понимаете изменить директории под Ваши собственные, если конечно они не совпадают. Далее:
configure -opensource -release ^
-nomake examples -nomake demos -nomake tools ^
-nomake translations -nomake docs ^
-no-exceptions -no-stl -no-rtti ^
-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 ^
-static -platform win32-g++

mingw32-make

Внимание выше перечислены библиотеки которые будут исключены из статической сборки, так что если Вам как и мне будет необходима например поддержка Qt3, то удалите -no-qt3support, и так все что Вам нужно, или добавте то что не нужно, но будьте аккуратны.

3. Всё. Сохраняем и запускаем наш .bat и идем пить кофе, библиотеки собираются теперь без нас.

После всего проделанного наши проекты будут собираться в режиме release полностью статично и можно скорее кодить, скидывать на флешку и нести показать все это нашему другу!

Отдельное спасибо за наставления и поддержку michurin
И не судите строго, надеюсь это кому-нибудь поможет, ведь сам искал это ну очень очень долго…
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 45
  • +1
    А какие примерно размеры получаются? Ясно что у каждого приложения свой, просто для примера что-нибудь.
    • 0
      Вот например в мое приложения я собственноручно подключаю следующие библиотеки QtGui/QApplication, QTextCodec, QDesktopWidget, QDebug, QtSql, QMessageBox + маленький файл ресурсов и 3 формы — занимает 8,5 Мб.
      Смог все это уменьшить на 2 Mб сделав Portable версию своей программы (нужно мне это было для того чтобы спрятать БД SQLite, которая шла рядом с .exe)
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          При статической линковке с LGPL (по которой также распространяется Qt) достаточно предоставить объектные файлы своего приложения, необходимые для сборки.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +1
              это всего лишь рекомендация.
              так делать можно
              • 0
                И правильно говорит, действительно, провести грань между использованием и производной работой бывает трудно. Во избежание таких затруднений и лицензионных споров и даётся эта рекомендация. Однако как уже сказали, это всего лишь рекомендация.
      • +3
        Зачем писать статью на тему, очень хорошо освещённую в документации?
        Да и любой желающий может очень быстро найти готовый батник в гугле.
        • +6
          Ну эт как сказать…
          Я пол года назад не смог найти способа реализовать это, в итоге в каталоге с прогой лежали 4 dll'ки — ни чего лучше сделать не удалось.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +3
              Чем это так ужасно?
        • НЛО прилетело и опубликовало эту надпись здесь
          • +2
            > простенькая программка, которая должна обрабатывать простой текстовый файл, для своей работы требует кучи дополнительных библиотек.
            Иииии… Что?

            Положил в папочку — и все, очень удобно. К тому же, что вы будете делать с плагинами для изображений, с sql-драйверами и прочим? Тоже все в exe пихать?
            И простенькая программа, которая должна обрабатывать простой текстовый файл будет занимать мегабайт 80.
            • +1
              программки с обработкой текстовых файликов следует писать на языках для этого созданных — awk, например!
            • 0
              А насколько легальна статическая линковка Qt с точки зрения лицензии?
              • +1
                Для варианта LGPL — абсолютно легальна.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Нет, не только. Можно использовать статическую линковку с LGPL и предоставлять скомпилированные obj файлы для перелинковки
                    stackoverflow.com/questions/2277165/qt-single-exe-with-lgpl
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • +1
                        1) файлы будут занимать не так уж и много места
                        2) необязательно класть их рядом с ехе, главное — предоставить к ним открытый доступ. Можно положить readme файлик, в котором будет ссылка для скачивания объектных файлов
                        • 0
                          по объему файлов можно выиграть раза в два, а то и больше, по опыту скажу
                    • 0
                      Это не совсем так. Есть вариант с предоставлением уже скомпилированных объектников. Например, так делают некоторые производители телевизоров с Linux на борту. Вот официальная страница по лицензированию qt.nokia.com/products/licensing
                      И там же можно найти FAQ по лицензиям и использованию LGPL в частности: qt.nokia.com/about/licensing/frequently-asked-questions#what-is-the-lgpl
                      In essence this means that Qt users may create proprietary applications that dynamically link to the LGPL-licensed Qt libraries provided he or she adheres to the requirements of the LGPL.

                      Таким образом получается что динамическая линковка возможна без каких-либо проблем, но нас интересует статическая. Посему едем дальше…
                      Открываем статью по LGPL в википедии: en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
                      Читаем там следующее:
                      Alternatively, a statically linked library is allowed if either source code or linkable object files are provided.

                      А вот что говорит другой источник answers.google.com/answers/threadview/id/439136.html:
                      You can thus distribute object files (and protect your source code)
                      and still comply with the requirements of the LGPL.

                      However, others (in particular, Richard Stallman) does not necessarily
                      interpret the LGPL in this way.

                      То бишь можно обойтись предоставлением уже скомпилированных объектников, но РМС это не одобряет (ну он и библиотеки призывает под чистой GPL распространять). Так что используйте, по возможности, динамическую линковку.
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +1
                          Не рекомендует — не значит запрещает.
                          Объем статически скомпонованного файла будет действительно несколько меньше, чем суммарный объем всех нужных библиотек при динамической линковке.
                          Так что собирайте статически себе на здоровье. А объектники таскать с собой никто не заставляет. Выложите их у себя на сайте и всего делов.
                  • 0
                    Ловкость рук и ни какого мошенничества!
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        Неправда, у троллей спрашивали, они специально сказали, что претензий не имеют.
                    • 0
                      А с компилятором msvc2010 мне нужно, кроме изменения PATH(и изменения файлика qmake.conf в папке C:\Qt\4.*.*\mkspecs\win32-msvc2010), и строчки
                      "-static -platform win32-g++" на "-static -platform win32-msvc2010"
                      на что изменить последнюю строку «mingw32-make»? на «msvc2010-make»?
                      это всё, я правильно полагаю? подскажите пожалуйста.
                      • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        Что-то не у меня не такая структура каталогов, странно.
                        configure вообще не ищется поиском в каталоге с Qt
                        Сейчас еще поковыряюсь.
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            Да, понимаю. Но нету. В корне лежат каталоги креатора, эмулятора, доки, примеры, че-то от симбиана и тд. Qt лежит в каталоге C:\QtSDK\Desktop\Qt\4.7.4
                            В общем, не понятно.
                            • НЛО прилетело и опубликовало эту надпись здесь
                        • 0
                          А теперь вопрос, что мы не сможем сделать и/или не будет работать после отключения этих опций:
                          -no-exceptions -no-stl -no-rtti -no-openssl -no-opengl
                          • 0
                            -no-webkit

                            А вот вебкит-то как раз статически и не скомпилится
                            • 0
                              если нужен к примеру статично webkit удалите
                              -no-webkit
                              из .bat-файла.
                              • 0
                                я давно не проверял, но разве они починили статическую сборку вебкита?
                                • 0
                                  Вебкит собирается (VS2010). Мы так делаем, с некоторыми ньюансами.
                                  1. Если вы включаете /LTCG, то для вебкита его нужно выключать иначе линкеру не хватит памяти чтобы собрать бибилиотеку.
                                  2. В том или ином виде нужно давать возможность пользователю слинковать приложение с другой версией вебкита. При этом ничего выкладывать в общий доступ не обязательно, достаточно просто дать пользователю такую возможность. Например указать в лицензионном соглашение что вы можете выдать объектные файлы по запросу пользователя.
                              • 0
                                Очень своевременная для меня статья, в связи с чем у меня вопрос, есть ли какие-нибудь особенности для 64-х разрядной системы?
                                • 0
                                  Честно говоря 100% уверенности конечно нет ни про webkit, ни про 64, но если у Вас получится (к чему я больше склоняюсь) просьба расскажите об этом.
                                  • 0
                                    Пока занят другим процессом, но как дойдут руки обязательно отпишусь.
                                  • 0
                                    Собрал вот под х64, всё супер!
                                  • 0
                                    Это больше бы пригодилось для разработки прог под AppStore…
                                    Но в целом статическая линковка не нужна, cmake fixup_bundle намного круче.
                                    • 0
                                      Мягко говоря статья получилась несколько слабовата.
                                      Да и полный мануал по разворачиванию статической сборки находится в гугле за пару минут, в вики коммьюнити ни qtcenter.org
                                      Собирать библиотеку Qt'вцы рекомендуют из сырых zip'ованых исходников (не используя инсталяторы), в частности и потому, что статическая сборка, как несложно догадаться, не реализует режим отладки, поэтому писать проект вы конечно же будете с использованием уже ранее установленной дефолтной сборке (к которой у вас все пути в переменных среды уже прописаны).
                                      Алсо свежий релиз библиотек под версией Qt 4.8.0 так же просто не соберется, в этот раз разработчики почему-то решили не убирать служебную утилиту syncqt, и если, перед тем, как пойти беспечно пить кофе, вы увидели в консоли сообщение типа mingw32-make: *** No rule to make target 'sub -src', то либо ставьте себе Perl(нужен для сборки этой самой syncqt), либо удаляйте из \bin все файлы syncqt.*
                                      • 0
                                        Делал все по инструкции — Reading C:/Qt/4.8.0/src/plugins/graphicssystems/graphicssystems.pro [C:/Qt/src/plugins/graphicssystems]
                                        Reading C:/Qt/4.8.0/src/plugins/graphicssystems/trace/trace.pro [C:/Qt/src/plugins/graphicssystems/trace]
                                        Reading C:/Qt/4.8.0/src/plugins/accessible/accessible.pro [C:/Qt/src/plugins/accessible]
                                        Reading C:/Qt/4.8.0/src/plugins/accessible/widgets/widgets.pro [C:/Qt/src/plugins/accessible/widgets]

                                        Qt is now configured for building. Just run mingw32-make.
                                        To reconfigure, run mingw32-make confclean and configure.

                                        C:\Qt>mingw32-make
                                        mingw32-make: *** No targets specified and no makefile found. Stop.

                                        что не так сделал?

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.