Конфигурирование 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) проводилась с помощью следующих шагов:

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

Тестирование проводилось отдельно для каждого из 36 параметров конфигурирования. При этом измерялось изменение размера библиотеки в оперативной памяти и на диске.

Стартовый размер библиотеки (при компиляции без указания каких-либо параметров конфигурирования) - 10249 KB на диске и 10220 KB в оперативной памяти (по данным memstat). Так как относительная разница между размерами библиотеки в памяти и на диске не превышает 1%, в таблице приводятся изменения размеров Qt на диске:
Параметр Размер, KB Краткое описание
-disable-canvas -128 Отключение canvas-модуля двумерной графики
-disable-iconview -175 Отключение модуля iconview
-disable-network -367 Отключение модуля поддержки сети
-disable-sql -489 Отключение SQL-модуля
-disable-table -disable-sql -665 Отключение модуля таблиц (требуется также отключение SQL-модуля)
-disable-xml -448 Отключение XML-модуля
-no-big-codecs -487 Отключение поддержки многобайтных кодировок: японских, корейских, китайских и тайваньских
-no-exceptions -3678 Отключение поддержки исключений C++
-no-ipv6 -2 Отключение поддержки протокола IPv6
-no-largefile -1 Отключение поддержки больших файлов
-no-nis +2 Отключение поддержки сетевых принтеров NIS (Network Information Service)
-no-sm -15 Отключение поддержки X11 Session Manager
-no-stl -343 Отключение поддержки Standard Template Library. Используйте, если вы предпочитаете работать с QTL
-no-style-cde -14 Отключение CDE-стиля
-no-style-motifplus -37 Отключение стиля motifplus
-no-style-platinum -39 Отключение стиля platinum
-no-style-sgi -43 Отключение SGI-стиля
-no-style-windows -no-style-platinum-95 Отключение windows-стиля (требуется также отключение стиля platinum)
-no-style-motif -no-style-motifplus
-no-style-cde -no-style-sgi
-157 Отключение motif-стиля (требуется также отключение стилей CDE, motifplus и SGI)
-no-xft -130 Отключение расширения Xft (поддержка масштабируемых шрифтов со сглаживанием)
-no-xinerama -4 Отключение поддержки многодисплейных конфигураций
-no-xkb 0 Отключение расширения XKB (X Keyboard Extension)
-no-xrender -134 Отключение расширения XRender (поддержка альфа-смешивания). Отключение этого расширения приводит к отключению расширения Xft
-no-xshape -1 Отключение расширения XShape (поддержка окон непрямоугольной формы)
-system-nas-sound +9 Поддержка NAS (Network Audio System). Дополнительно требуется пакет nas-dev
-system-libjpeg -113 Использование системной библиотеки libjpeg для плагина libqjpeg. Дополнительно требуется пакет libjpeg62-dev
-system-libmng -189 Использование системной библиотеки libmng для плагина libqmng. Дополнительно требуется пакет libmng-dev
-system-libpng -124 Использование системной библиотеки libpng. Дополнительно требуется пакет libpng2-dev
-system-zlib -44 Использование системной библиотеки zlib. Дополнительно требуется пакет zlib1g-dev
-cups +1 Поддержка Common UNIX Printing System. Дополнительно требуется пакет libcupsys2-dev
-qt-gif +9 Поддержка GIF-формата
-tablet +5 Поддержка планшетных устройств ввода, типа Wacom Tablet
-thread -disable-opengl +41 Поддержка многопоточности
-thread -enable-opengl +114 Поддержка OpenGL (требуется также поддержка многопоточности)
-thread -dlopen-opengl +119 Поддержка OpenGL (библиотека будет загружаться только в случае явной необходимости с помощью системного вызова dlopen)
-DQT_NO_SVG -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
ПриложениеДоПослеДоПосле
Assistant612 365 14060 10512
Designer4319 2485 15012 10784
Linguist520 334 10952 7504
Qtconfig236 143 10272 6844

Выводы

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

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