Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: .maggot от Декабрь 09, 2006, 14:48



Название: Уменьшение exe при статической линковке
Отправлено: .maggot от Декабрь 09, 2006, 14:48
Сделал чтобыв либы линковались статически, и появилась проблема - размер пустой проги = 3,54 мб
Это можно как то исправить?


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 09, 2006, 15:25
Перед сборкой Qt подправить:

Код:
qt4/src/corelib/global/qconfig.h


Править можно после ./configure и перед make. ВьІкинуть модули, что не нужньІ. Только учтите, что ето официально не заявлено и не поддерживается Троллями. В основном ето способ уменьшить Qt на Embedded системах. Ещё учтите, что некоторьІе модули завязаньІ друг на друге. Подробнее в qfeatures.txt в том же каталоге.

После сборки всей программьІ проходимся по EXE файлу PECompact'ом:
PECompact (http://www.bitsum.com)

У меня получилось уменьшить программу в статической сборке:

QAxServer + QtCore + QtGui + QtNetwork + QtXml + QtOpenGL + jpeg + gif + runtime + свой собственньй код = 1 Мб exe файл.


Название: Уменьшение exe при статической линковке
Отправлено: ElderOrb от Декабрь 09, 2006, 19:37
Ого!.. Неплохо, по-сравнению с моими ~1.3 мега QtCore + QtGui + QtXml + runtime + upx. Правда Qt собирал на дефолтных настройках в статике. А можно пример удачной правки этого qconfig.h?


Название: Уменьшение exe при статической линковке
Отправлено: fanat9 от Декабрь 09, 2006, 20:31
В qtopia-core Тролли даже сделали tool qconfig для конфигурирования qconfig.h -  там features выделены в группы по зависимости.

http://doc.trolltech.com/4.2/qtopiacore-features.html


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 09, 2006, 22:37
Пример удачной правки qconfig.h будет в понедрельник с работьІ. Там вьІрезано всё, что мне не нужно в проекте. Плюс пришлось подправить исходники Qt в *_win.cpp файлах - повторяю, официально под винду ето не поддерживается, только в Qtopia Core. Правок - кот наплакал. Для статической сборки подобное хамство простимо. :)


Название: Уменьшение exe при статической линковке
Отправлено: Alex03 от Декабрь 11, 2006, 15:44
Ещё очень много отжирает проброс исключений (которые сама qt не пользует) сквозь код qt-либы. Если такие исключения не используются, то можно очень сильно уменьшить размер бинарника. По крайней мере в qt3, с qt4 я пока не работал. :(
configure -no-exceptions ....


Название: Уменьшение exe при статической линковке
Отправлено: Вячеслав от Декабрь 11, 2006, 18:38
Кстати - провакациооный вопрос - а на кой Х это надо ? Делаем одну прогу для одной машины ? или винт на 20 метров ? Моя в раздумьях .....


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 11, 2006, 19:50
На кой 'Икс' ето надо? Ну, например мне ето надо для ActiveX компонента, больше полтора метра exe файл без зависимостей заказчик не примет. Ибо конечньІй продукт рассчитан на широкий круг пользователей з узким каналом. Скорость загрузки страницьІ с ActiveX очень критична.

Другой заказчик вьІставляет требования размера игрушки до 10 метров (для загрузки и продажи через интернет). ЗапакованньІе в ZIP Qt библиотеки могут весить 3-4 метра, жертвуем ресурсами.

Здесь не важна совместимость на бинарном уровне и поддержка Qt плагинами. Ето одноразовьІе продуктьІ, обновление которьІх заключается в скачивании новой версии.


Название: Уменьшение exe при статической линковке
Отправлено: Вячеслав от Декабрь 11, 2006, 20:55
Мдя .... в эту сторону не глядел :( Посыпаю голову пеплом ... Мне только в одном(пока) случае пришлось qt ужимать - для встраиваемой железки ;)


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 12, 2006, 07:40
Итаааак, после долгих ночньІх експериментов удалось подстричь Qt по самьІе нехочу. СтандартньІй пример из Qt manderbrot (считает в отдельном потоке картинку по фрактальньІм алгоритмам) получился 783 кб. Абсолютно работоспособньІй и без единой зависимости.

Ето на Qt 4.2.0. Сёдня соберу на Qt 4.2.2 и дам рецепт для всех страждущих.

:D


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 13, 2006, 05:19
Приступаем.

Сначала пару общих слов. Нижеприведённый солюшн для Qt 4.2.2 коммерческой версии Qt под винду. Компилятор MSVC 7.1. Способ официально не поддерживается, так что без хаков не обойтись. Подхаканые файлы прилагаются в архиве, который я ещё не знаю куда выложить.

Большинство методов уменьшения конечного исполняемого файла основано на выкидывании из Qt фич (features). Каждая фича в Qt имее своё название и макрос, отключающий её, например QT_NO_VALIDATOR. Список приведён в файле qtdir/src/corelib/global/qfeatures.txt, а заголовочник, что их выключает генерируется в ходе configure и лежит здесь: qtdir/src/corelib/global/qconfig.h

Фичи, что можно выключить в параметрах configure далеко не все, их гораздо больше. Для динамически собираемых библиотек ето критично из-за обратной бинарной совместимости, плагинов. Например, в Линуксе Qt4 всегда собрана по максимуму. Для статических приложений, что будут инсталлироваться на винду или Мак ето не критично, всё что вам не нужно можно без зазрения совести вырезать.

Если фича зависит от другой фичи (например, TABDIALOG зависит от TABBAR), то выключение последней неявно выключает всю цепочку, что от неё зависит (выключая TABBAR исчезнет и TABDIALOG).

Процесс сборки статической урезанной Qt аля Dendy.

1. Распаковываем архив с исходниками в новый каталог. Назовём его C:\qt4micro. Для економии времени можете пропустить каталоги: demos doc examples.
Заранее рекомендую создать bat-файл, в котором будут прописаны необходимые переменные окружения студии и нашей либы. Проще всего ето сделать, скопировав файл Microsoft Visual Studio 7\Common7\Tools\vsvars32.bat в другую папку (например, qtdir) и добавив в начало:
Код:
@set PATH=C:\qt4micro\bin;%PATH%
@set QTDIR=C:\qt4micro
@set QMAKESPEC=win32-msvc.net

Етим избежите путаницы с несколькими версиями Qt на одной машине. После загрузки коммандной строки просто выполните етот bat-файл.

2. Убираем из списка проектов demos и examples. Ето секономит время на генерации Makefile'ов. В файле qtdir/projects.pro на 13-й строке ставим:
Код:
#   SUBDIRS += demos examples


3. Убираем зависимость от Runtime библиотек. В файле qtdir/mkspecs/win32-msvc.net/qmake.conf заменяем значения:
Код:
QMAKE_CFLAGS_RELEASE = -O1 -MD
QMAKE_CFLAGS_DEBUG = -Zi -MDd

на
Код:
QMAKE_CFLAGS_RELEASE = -O1 -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd


4. Пришло время конфигурить. Собственно, список параметров не особо важен, так как мы всё равно из подменим перед сборкой. Хочу отметить следующее: не ставьте флаг -no-qmake, если скармливаете конфигуратору qmake, собранный не в етой же папке. Вот мои параметры:
Код:
configure.exe -release -static -no-exceptions -no-accessibility -no-stl -no-qt3support -qt-gif -qt-libjpeg -no-dsp -no-vcproj -no-rtti -no-style-windowsxp -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde


5. НЕ нажимаем nmake. Рано.

6. Копируем содержимое папки src из прилагаемого мною архива в папку qtdir/src. На вопрос заменить ли отвечаем ДА. Не волнуйтесь. В подправленных мною исходниках Qt не изменена ни на байт. Просто добавлены соответствующие макросы в платформозависимую часть (файлы _win.cpp).
Самое главное что заменяется - файл конфигурации qtdir/src/corelib/qconfig.h. Если вам что-то нужно добавить в сборку, ето нужно сделать сейчас. Добавляется путём комментирования макросов соответствующей фичи и всех фич от которых она зависит.

7. Для сборки Qt необходимы утилиты moc uic rcc dumpcpp idc. Так вот, они не соберутся, если вы запустите nmake прямо сейчас, так как для них могут понадобиться фичи, которые исключены в qconfig.h. Делаем просто: берём ети утилиты из ранее правильно собранной Qt, пусть даже с шаровыми либами, и копируем в нашу папку qtdir/bin.

8. Собираем Qt руками. Каждый модуль. Порядок неважен, ибо линковщик не задействован.
Код:
cd src\corelib
nmake
cd ..\xml
nmake
cd ..\gui
nmake
cd ..\network
nmake
cd ..\opengl
nmake
cd ..\activeqt\control
nmake
cd ..\sql
nmake


Собственно, всё. Теперь пробуем собрать проект на нашей либе. Проект, что не юзает фичи, что были выключены. Например, mandelbrot работает отлично.

Дополнительно урезать исполняемый файл можно с помощью утилиты PECompact. Брать здесь: http://www.bitsum.com


Название: Уменьшение exe при статической линковке
Отправлено: Tonal от Декабрь 13, 2006, 07:50
А на qtlib.ru в статьи или wiki закинешь?
Туда сильно удобнее ссылки ставить. ;-)


Название: Уменьшение exe при статической линковке
Отправлено: Вудруф от Декабрь 13, 2006, 09:21
А для MinGW что изменится?


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 13, 2006, 15:53
Никогда не пользовался Wiki. Обьясните, как вставить статью и можно ли прикрепить файл?


Название: Уменьшение exe при статической линковке
Отправлено: ElderOrb от Декабрь 14, 2006, 01:06
Пока не было возможности проверить всё вышенаписанное, но что-то мне подсказывает что всё будет ок! Отличная работа! Присоединяюсь к Вудруф-у, это нужно поместить в вики. Мало того, может быть имело бы смысл предложить троллтехам сделать нормальный кофигуратор этих фич?

2All: не дайте мудрости пропасть! Расскажите Dendy (и мне заодно) как рулить Qt-шным вики?


Название: Уменьшение exe при статической линковке
Отправлено: Вудруф от Декабрь 14, 2006, 07:54
Цитировать
Присоединяюсь к Вудруф-у, это нужно поместить в вики.

Это не я, это Tonal предлагал :)
Я же спросил про версию для MinGW...


Название: Уменьшение exe при статической линковке
Отправлено: Tonal от Декабрь 14, 2006, 08:02
Там совсем всё просто.
Идёшь в FAQs/"FAQ от qtlib.ru"/"Послать вопрос"
Открывается формочка.
Заполняешь её и отправляешь.
Файлы там цеплять можно.
Правда не совсем понятно, что с форматированием...


Название: Уменьшение exe при статической линковке
Отправлено: gelo от Декабрь 14, 2006, 08:21
А как бы прицепить плагины при статичной компоновке? Особенно интересует qjpeg1.dll. Как бы его "впихнуть" в создаваемый ехе?


Название: Уменьшение exe при статической линковке
Отправлено: Tonal от Декабрь 14, 2006, 11:15
Ну, это-то можно через configure задать.


Название: Уменьшение exe при статической линковке
Отправлено: gelo от Декабрь 14, 2006, 11:37
Ну, это-то можно через configure задать.
а как?


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 14, 2006, 14:01
ПлагиньІ в конфигураторе задавать не нужно! Например, в одном проекте вьІ хотите использовать JPEG, в другом нет, так зачем пересобирать для етого всю либу? ПлагиньІ подключаются статически в файле проекта, например:

Код:
QTPLUGIN += qjpeg qgif


А в программе:

Код:
Q_IMPORT_PLUGIN( qjpeg )
Q_IMPORT_PLUGIN( qgif )


Только не забудьте дособрать плагиньІ при сборке статической Qt:

Код:
cd src\plugins\imageformats\jpeg
qmake
nmake

cd ..\gif
qmake
nmake


Название: Уменьшение exe при статической линковке
Отправлено: noname.pl от Декабрь 20, 2006, 15:44
2Dendy% а где находятся файлы которые вы не знаете куда выложить?
p.s.: qt 4.2.2 win commmercial ---- дайте кто-нить файл лицензии. не могу найти в гугле.


Название: Уменьшение exe при статической линковке
Отправлено: Dendy от Декабрь 20, 2006, 17:03
Файл один - zip архив. Находится у меня на винте :)