Приступаем.
Сначала пару общих слов. Нижеприведённый солюшн для 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