Wiki

Конфигурирование Qt 3.3

Автор: Andi Peredri В этой статье рассматриваются нюансы конфигурирования Qt версии 3.3 с целью получения более компактного объектного кода. Статья может быть полезна как разработчикам, тесно работающим с Qt, так и обычным пользователям, интересующимся вопросами более эффективного использования системных ресурсов.

Введение

Если вы хоть раз изучали вывод команды ./configure -h, запущенной в инсталляционном каталоге Qt, то вас наверняка интересовал вопрос о влиянии каждого конфигурационного параметра на будущую работу и эффективность Qt. Проведенное небольшое исследование поможет определить целесообразность установки того или иного параметра, взяв за основу его влияние на конечный размер библиотеки. Для тестирования использовалась версия 3.3.0 библиотеки Qt для платформы Linux (XFree86 4.1.0). Компиляция (gcc 2.95) проводилась с помощью следующих шагов:
  • ./make clean - очистка предыдущей конфигурации.
  • ./configure -fast ... - конфигурирование библиотеки (без примеров).
  • ./make src-install - сборка и установка библиотеки.
  • ./make plugins-install - сборка и установка плагинов.

Результаты тестирования

Тестирование проводилось отдельно для каждого из 36 параметров конфигурирования. При этом измерялось изменение размера библиотеки в оперативной памяти и на диске. Стартовый размер библиотеки (при компиляции без указания каких-либо параметров конфигурирования) - 10249 KB на диске и 10220 KB в оперативной памяти (по данным memstat). Так как относительная разница между размерами библиотеки в памяти и на диске не превышает 1%, в таблице приводятся изменения размеров Qt на диске:
Параметр >Размер, KB Краткое описание
-disable-canvas align=right>-128 Отключение canvas-модуля двумерной графики
-disable-iconview align=right>-175 Отключение модуля iconview
-disable-network align=right>-367 Отключение модуля поддержки сети
-disable-sql align=right>-489 Отключение SQL-модуля
-disable-table -disable-sql align=right>-665 Отключение модуля таблиц (требуется также отключение SQL-модуля)
-disable-xml align=right>-448 Отключение XML-модуля
-no-big-codecs align=right>-487 Отключение поддержки многобайтных кодировок: японских, корейских, китайских и тайваньских
-no-exceptions align=right>-3678 Отключение поддержки исключений C++
-no-ipv6 align=right>-2 Отключение поддержки протокола IPv6
-no-largefile align=right>-1 Отключение поддержки больших файлов
-no-nis align=right>+2 >Отключение поддержки сетевых принтеров NIS (Network Information Service)
-no-sm align=right>-15 Отключение поддержки X11 Session Manager
-no-stl align=right>-343 Отключение поддержки Standard Template Library. Используйте, если вы предпочитаете работать с QTL
-no-style-cde align=right>-14 Отключение CDE-стиля
-no-style-motifplus align=right>-37 Отключение стиля motifplus
-no-style-platinum align=right>-39 Отключение стиля platinum
-no-style-sgi align=right>-43 Отключение SGI-стиля
-no-style-windows -no-style-platinum align=right>-95 Отключение windows-стиля (требуется также отключение стиля platinum)
-no-style-motif -no-style-motifplus
-no-style-cde -no-style-sgi
align=right>-157 Отключение motif-стиля (требуется также отключение стилей CDE, motifplus и SGI)
-no-xft align=right>-130 Отключение расширения Xft (поддержка масштабируемых шрифтов со сглаживанием)
-no-xinerama align=right>-4 Отключение поддержки многодисплейных конфигураций
-no-xkb align=right>0 Отключение расширения XKB (X Keyboard Extension)
-no-xrender align=right>-134 Отключение расширения XRender (поддержка альфа-смешивания). Отключение этого расширения приводит к отключению расширения Xft
-no-xshape align=right>-1 Отключение расширения XShape (поддержка окон непрямоугольной формы)
-system-nas-sound align=right>+9 Поддержка NAS (Network Audio System). Дополнительно требуется пакет nas-dev
-system-libjpeg align=right>-113 Использование системной библиотеки libjpeg для плагина libqjpeg. Дополнительно требуется пакет libjpeg62-dev
-system-libmng align=right>-189 Использование системной библиотеки libmng для плагина libqmng. Дополнительно требуется пакет libmng-dev
-system-libpng align=right>-124 Использование системной библиотеки libpng. Дополнительно требуется пакет libpng2-dev
-system-zlib align=right>-44 Использование системной библиотеки zlib. Дополнительно требуется пакет zlib1g-dev
-cups align=right>+1 Поддержка Common UNIX Printing System. Дополнительно требуется пакет libcupsys2-dev
-qt-gif align=right>+9 Поддержка GIF-формата
-tablet align=right>+5 Поддержка планшетных устройств ввода, типа Wacom Tablet
-thread -disable-opengl align=right>+41 Поддержка многопоточности
-thread -enable-opengl align=right>+114 Поддержка OpenGL (требуется также поддержка многопоточности)
-thread -dlopen-opengl align=right>+119 Поддержка OpenGL (библиотека будет загружаться только в случае явной необходимости с помощью системного вызова dlopen)
-DQT_NO_SVG align=right>-119 Отключение поддержки формата SVG (Scalable Vector Graphics). Используется в QPicture как один из форматов импорта и экспорта
В таблице отсутствуют данные, полученные при компиляции Qt без модулей kernel, widgets, dialogs, styles, tools и workspace. Несмотря на возможность удачной компиляции Qt без этих модулей, целесообразность такого решения остается под вопросом, так как эти модули необходимы для работы других Qt-приложений, таких как Qt Config и Qt Designer. Также возникают трудности при компоновке полученной таким образом библиотеки с не-GUI приложениями (в 4-ой версии Qt будет уделено больше внимания поддержке не-GUI приложений). Консольная программа qmake, несмотря на то, что написана с использованием Qt, не требует для своей работы наличие самой библиотеки, так как статически компонуется с необходимыми объектными файлами. Если вы интересуетесь разработкой не-GUI приложений с помощью Qt 3, то можете применить аналогичный подход (см. qt/qmake). Также в таблице отсутствуют параметры конфигурирования для SQL-модулей, так как они могут быть скомпилированы как плагины. Если есть возможность скомпилировать Qt-модуль как плагин, всегда поступайте именно так. Qt загружает плагины только в случае явной необходимости, поэтому они обеспечивают более экономное использование памяти. По этой же причине Qt-модули поддержки графических форматов JPEG и MNG по умолчанию скомпилированы как плагины.

Поддержка исключений

Если вы в своей программе не используете исключения, то можете смело отключить их поддержку в Qt (параметр -no-exceptions). Как видно из приведенной таблицы, этот параметр в наибольшей степени влияет на размер библиотеки Qt, и поэтому часто используется производителями дистрибутивов. При этом компилятор не будет генерировать таблицу диапазонов адресов кода со списками деструкторов и обработчиками исключений. В результате будет получен намного более компактный код. Если вы применяете исключения в своей программе, то у вас все еще остается возможность воспользоваться параметром -no-exceptions. При этом нужно помнить, что генерируемые вами исключения не должны покидать обработчики сообщений, функции обратного вызова и слоты. В противном случае программа завершится аварийно. Весомым аргументом против генерации исключений в слотах является то, что не всегда возможно определить в точке вызова сигнала слот-источник исключения (Qt позволяет связать один сигнал с несколькими слотами). Таким образом, механизм сигналов-слотов Qt в некоторой степени несовместим с механизмом исключений C++ и накладывает определенные ограничения на использование исключений в Qt-программах.

Сборка библиотеки и приложений

При работе над проектом выполните комплексную оценку используемых в нем средств и соответственно настройте Qt. Вот пример такой конфигурации для проекта, использующего модули network и xml:
    ./configure -disable-iconview -disable-canvas -disable-sql -disable-table
		-no-big-codecs -no-exceptions -no-stl -no-style-motif
		-no-style-motifplus -no-style-cde -no-style-sgi -system-libjpeg
		-system-libmng -system-libpng -system-zlib -DQT_NO_SVG
Полученный после сборки размер библиотеки составляет 5022 KB на диске и 5000 KB в оперативной памяти. Это более, чем в два раза меньше начального размера библиотеки! При установке новой версии Qt сохраните (переименуйте) файл-сценарий предыдущей конфигурации qt/config.status и используйте его вместо сценария qt/configure в дальнейшем. Это избавит вас от необходимости повторно вводить длинный перечень параметров конфигурирования Qt. Также учтите, что параметры, указываемые при конфигурировании Qt, влияют на процесс сборки других Qt-приложений: Qt Assistant, Qt Designer, Qt Linguist и т.д. Поэтому занимаемый ими размер (и на диске, и в оперативной памяти) также значительно сократится:
Размер на диске, KB Размер в памяти, KB
Приложение До После До После
Assistant 612 365 14060 10512
Designer 4319 2485 15012 10784
Linguist 520 334 10952 7504
Qtconfig 236 143 10272 6844

Выводы

И разработчики, активно работающие с несколькими версиями Qt, и пользователи, использующие лишь одно Qt-приложение, одинаково заинтересованы в эффективном использовании системных ресурсов. Это становится возможным благодаря гибкой системе конфигурирования и модульной архитектуре Qt. Однако нужно помнить, что узкоспециализированная конфигурация Qt может потребовать в будущем перекомпилирования как самой библиотеки, так и Qt-приложений, так как многие из рассмотренных нами параметров конфигурирования приводят к изменению прикладных интерфейсов программирования (API) и двоичного интерфейса (ABI) библиотеки.