Russian Qt Forum
Март 28, 2024, 13:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Уменьшение exe при статической линковке  (Прочитано 26363 раз)
.maggot
Гость
« : Декабрь 09, 2006, 14:48 »

Сделал чтобыв либы линковались статически, и появилась проблема - размер пустой проги = 3,54 мб
Это можно как то исправить?
Записан
Dendy
Гость
« Ответ #1 : Декабрь 09, 2006, 15:25 »

Перед сборкой Qt подправить:

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


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

После сборки всей программьІ проходимся по EXE файлу PECompact'ом:
PECompact

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

QAxServer + QtCore + QtGui + QtNetwork + QtXml + QtOpenGL + jpeg + gif + runtime + свой собственньй код = 1 Мб exe файл.
Записан
ElderOrb
Гость
« Ответ #2 : Декабрь 09, 2006, 19:37 »

Ого!.. Неплохо, по-сравнению с моими ~1.3 мега QtCore + QtGui + QtXml + runtime + upx. Правда Qt собирал на дефолтных настройках в статике. А можно пример удачной правки этого qconfig.h?
Записан
fanat9
Гость
« Ответ #3 : Декабрь 09, 2006, 20:31 »

В qtopia-core Тролли даже сделали tool qconfig для конфигурирования qconfig.h -  там features выделены в группы по зависимости.

http://doc.trolltech.com/4.2/qtopiacore-features.html
Записан
Dendy
Гость
« Ответ #4 : Декабрь 09, 2006, 22:37 »

Пример удачной правки qconfig.h будет в понедрельник с работьІ. Там вьІрезано всё, что мне не нужно в проекте. Плюс пришлось подправить исходники Qt в *_win.cpp файлах - повторяю, официально под винду ето не поддерживается, только в Qtopia Core. Правок - кот наплакал. Для статической сборки подобное хамство простимо. Улыбающийся
Записан
Alex03
Гость
« Ответ #5 : Декабрь 11, 2006, 15:44 »

Ещё очень много отжирает проброс исключений (которые сама qt не пользует) сквозь код qt-либы. Если такие исключения не используются, то можно очень сильно уменьшить размер бинарника. По крайней мере в qt3, с qt4 я пока не работал. Грустный
configure -no-exceptions ....
Записан
Вячеслав
Гость
« Ответ #6 : Декабрь 11, 2006, 18:38 »

Кстати - провакациооный вопрос - а на кой Х это надо ? Делаем одну прогу для одной машины ? или винт на 20 метров ? Моя в раздумьях .....
Записан
Dendy
Гость
« Ответ #7 : Декабрь 11, 2006, 19:50 »

На кой 'Икс' ето надо? Ну, например мне ето надо для ActiveX компонента, больше полтора метра exe файл без зависимостей заказчик не примет. Ибо конечньІй продукт рассчитан на широкий круг пользователей з узким каналом. Скорость загрузки страницьІ с ActiveX очень критична.

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

Здесь не важна совместимость на бинарном уровне и поддержка Qt плагинами. Ето одноразовьІе продуктьІ, обновление которьІх заключается в скачивании новой версии.
Записан
Вячеслав
Гость
« Ответ #8 : Декабрь 11, 2006, 20:55 »

Мдя .... в эту сторону не глядел Грустный Посыпаю голову пеплом ... Мне только в одном(пока) случае пришлось qt ужимать - для встраиваемой железки Подмигивающий
Записан
Dendy
Гость
« Ответ #9 : Декабрь 12, 2006, 07:40 »

Итаааак, после долгих ночньІх експериментов удалось подстричь Qt по самьІе нехочу. СтандартньІй пример из Qt manderbrot (считает в отдельном потоке картинку по фрактальньІм алгоритмам) получился 783 кб. Абсолютно работоспособньІй и без единой зависимости.

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

Веселый
Записан
Dendy
Гость
« Ответ #10 : Декабрь 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
Записан
Tonal
Гость
« Ответ #11 : Декабрь 13, 2006, 07:50 »

А на qtlib.ru в статьи или wiki закинешь?
Туда сильно удобнее ссылки ставить. ;-)
Записан
Вудруф
Гость
« Ответ #12 : Декабрь 13, 2006, 09:21 »

А для MinGW что изменится?
Записан
Dendy
Гость
« Ответ #13 : Декабрь 13, 2006, 15:53 »

Никогда не пользовался Wiki. Обьясните, как вставить статью и можно ли прикрепить файл?
Записан
ElderOrb
Гость
« Ответ #14 : Декабрь 14, 2006, 01:06 »

Пока не было возможности проверить всё вышенаписанное, но что-то мне подсказывает что всё будет ок! Отличная работа! Присоединяюсь к Вудруф-у, это нужно поместить в вики. Мало того, может быть имело бы смысл предложить троллтехам сделать нормальный кофигуратор этих фич?

2All: не дайте мудрости пропасть! Расскажите Dendy (и мне заодно) как рулить Qt-шным вики?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 21.