Qt. Кроссплатформенное программирование в Windows.

28.10.2009
Новиков Максим Глебович

Содержание

Выбор среды программирования.
(фреймворк, среда управления проектом, язык).

Через полгода после моего перехода на Linux я задался вопросом программирования под ним. В поисках удобной среды разработки я столкнулся не с очень радостным для себя фактом. В операционной системе Linux для обычных языков-компиляторов типа С++ не оказалось визуальной среды программирования. Во всех найденных мною решениях интерфейс рисовался в одной программе, а весь код надо было писать и компилировать в другой. При этом события интерфейса с функциями, их обрабатывающими, в таком варианте приходилось состыковывать вручную.

Вышеописанный способ программирования заставляет делать лишние телодвижения, от которых я отвык, программируя под Windows в различных визуальных «студиях». Есть, правда, Lazarus (визуальная IDE для языка Pascal, аналог Дельфи), но он сам по себе ещё сыроват, хотя, на мой взгляд, очень перспективен именно из за полноценной IDE.

Тогда я стал копаться с имеющимися невизуальными средами разработки приложений и обнаружил, пожалуй, самую мощную бесплатную систему программирования для Linux — Netbeans от весьма уважаемой программистами фирмы Sun Microsystems. Помимо своего мощного функционала, практически не уступающего функционалу подобных сред для Windows, Netbeans является кроссплатформенной системой. То есть существует версия этой программы и для Windows, и для Mac OS X, и для Linux, и для Solaris (собственная ОС от San). Кроме того, среда поддерживает в виде плагинов несколько языков программирования, а для некоторых из них (например, Java) — даже визуальный редактор интерфейса. И хотя для C++ такого редактора там не было, можно было пристыковать сторонние интерфейсные редакторы и работать с ними, хотя и с меньшим удобством.

Когда со средой я определился, осталось выбрать основу интерфейса — фреймворк (библиотеку построения интенрфейса). Дело в том, что если в Windows интерфейс рабочего стола один (хотя его стили могут быть разными), и его библиотеки всегда имеются в составе операционной системы по умолчанию, то в Linux разных рабочих столов довольно много. Наиболее известные — это Gnome и KDE. Основаны эти интерфейсы на двух разных библиотеках. Какие же библиотеки использовать при программировании, или, иными словами, для какого рабочего стола писать? Использовать библиотеку GTK+, на которой основан Gnome, или Qt, на которой основан KDE?

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

Поскольку родной язык для Qt — это C++, то выбор языка программирования определился сам собой.

Таким образом, я, по сути, принял максималистское решение. Взял самую мощную кроссплатформенную IDE и самый мощный кроссплатформенный фреймворк. Имея в распоряжении такие средства, странно было бы не заняться именно кроссплатформенным программированием, чтобы тот же самый исходник можно было откомпилировать в программу и для Linux и для Windows.

Ниже я опишу методику создания рабочей среды в системе Windows, поскольку, как ни странно, именно в этой операционной системе возникли основные сложности. В Linux всё скачалось и установилось как-то само собой, и я даже не запомнил процесса, чтобы его описать. Впрочем, при желании вы легко можете найти его описание в Интернете.

Для создания кроссплатформенных приложений я выбрал следующий подход. Основной системой у меня стоит Linux, в виртуальной машине которого установлена Windows. Программу я пишу в Linux, а при необходимости отладить и скомпилировать вариант программы для Windows, я запускаю виртуальную машину, и все окончательные действия по отладке и компиляцию произвожу там. В качестве виртуальной машины я использую бесплатную VirtualBox, опять же, от Sun Microsystems.

[Вернуться в начало]

Несколько общих замечаний о Qt.
(то, что следует знать перед более плотным знакомством с библиотекой Qt).

  1. Библиотека Qt разрабатывалась как системная библиотека, то есть, библиотека, которая должна изначально находиться в системе безотносительно от каких бы то ни было использующих её приложений. Но в Windows она по умолчанию не установлена, поэтому имейте ввиду, что вашу программу придётся распространять вместе с использованными в ней библиотеками упомянутого фреймворка.
    Для минимального приложения с графическим интерфейсом это библиотека ядра QtCore.dll (2,73 Мб) и библиотека графического интерфейса QtGui.dll (11,3 Мб). Кроме того, этому приложению будет требоваться небольшая библиотека потоконезависимого перехвата исключений mingwm10.dll (15,4 кб). Итого около 14,5 Мб. Если же вы будете использовать в приложении изображения разных форматов (за исключением png — он интегрирован) или какие-либо другие модули, выполненные в виде дополнительных библиотек (т.н. плагинов), то их dll-ки тоже придётся скидывать в соответствующую папку и помещать её рядом с вашим приложением. Правда, такие dll-ки, как правило, занимают совсем немного места.
  2. Помимо варианта с распространением библиотек в виде dll-файлов существует вариант включения необходимых библиотек в файл вашей программы (т. н. статическая компановка, называемая ещё статической линковкой или статической компиляцией). Это может немного снизить общий объём пакета и упростить распространение, хотя и раздует исполнимый файл. Поэтому такой вариант следует использовать только при относительно небольших проектах.
    Поскольку, как я уже говорил выше, библиотека сделана, как системная, её классы сильно завязаны между собой, а потому размер исполнимого файла будет не намного меньше суммарного размера всех привязанных к проекту dll-ок. Для сжатия такого файла можно воспользоваться упаковщиком исполнимых файлов, который уменьшает размер итоговой программы в 2-3 раза. Например, существует хороший бесплатный упаковщик UPX (http://upx.sourceforge.net), работающий из командной строки, а также несколько разных графических интерфейсов к нему (например, UPX X-Shell: http://www.urixsoft.com/ru/index.htm?soft-upx&frameleft_s).
    Для статического включения библиотек в файл программы необходимо настроить библиотеку Qt на статический режим и заново пересобрать её. Этот процесс несложен, но сама пересборка занимает несколько часов машинного времени. О методике выполнения настройки и статической компиляции библиотеки Qt читайте в моей статье «Qt. Статическая сборка проекта».
  3. При установке среды программирования, а также при создании папки для ваших проектов не используйте в именах путей русские буквы, а тем более пробелы. Следуя этому правилу вы избежите потенциальных сбоев при компиляции ваших программ. Кроме того, я вообще рекомендую оставить все пути по умолчанию во избежании ваших же собственных ошибок из-за невнимательности при инсталляции дополнительных пакетов.

[Вернуться в начало]

Скачивание необходимых программ

Сначала подготовим для установки все нужные нам дистрибутивы. Выделяем специальную папку и скачиваем туда следующее:

http://sourceforge.net/projects/mingw/files

exe-файл из «Automated MinGW Installer» (155 кб) — компиляторы с библиотеками
exe-файл из «MSYS Base System» (3,13 Мб) — в т.ч. утилита сборки проекта
exe-файл из «GNU Source-Level Debugger» (1,76 Мб) — отладчик

http://qt.nokia.com/downloads

вкладка LGPL / Free, Qt: Framework Only (208 Мб) — библиотека Qt

http://java.sun.com/javase/downloads/index.jsp

JRE (16 Мб) — Java-машина

http://www.netbeans.org/downloads/index.html

NetBeans, платформа Windows, язык Русский (35 Мб) — интегрированная среда

Итого около 300 Мб, что не так много по сравнению с дистрибутивами визуальных студий.

[Вернуться в начало]

Инсталляция программ в Windows

  1. Инсталлируем Automated MinGW Installer (MinGW) и запоминаем куда.
  2. Инсталлируем MSYS Base System (MSYS). После завершения инсталляции откроется окно консоли, в котором надо будет ответить на 3 вопроса. Два раза отвечаете «y» а на третий вопрос вбиваете путь к папке MinGW, используя прямые слеши для разделения папок, например: C:/MinGW, а не обратные, как это принято в Windows. После этого программа допишет в эту папку некоторые свои скрипты, пожалуется на отсутствие файла make.exe (так и должно быть) и закончит работу. Если ошибётесь с путём, программа создаст свою папку MinGW внутри своей директории. Это не страшно, главное, что нам нужно от MSYS — это её компановщик — файл make.exe, поскольку родной компановщик mingw32-make.exe средой Netbeans не поддерживается.
  3. Инсталлируем отладчик GNU Source-Level Debugger (GDB) в папку MinGW.
  4. Инсталлируем Qt. Замечу, что при инсталляции этой библиотеки в реестр прописываются пути к папке её установки, поэтому впоследствии переносить её в другое место простым копированием не следует. Лучше деинсталлировать её из прежней папки и заново инсталлировать в новую, тем более, что по времени этот процесс будет не намного дольше.
    Во время инсталляции программа спросит, надо ли скачать и установить MinGW, или он уже установлен. Поскольку мы его уже установили, указываем путь к нему и продолжаем установку.
  5. Инсталлируем Java-машину (JRE) для того, чтобы могла работать написанная на Java среда Netbeans.
  6. Инсталлируем Netbeans. Хотя никаких вопросов при установке Netbeans не возникает, официальную инстукцию по её установке можно найти по адресу:

    http://www.netbeans.org/community/releases/67/install_ru.html

    Замечу, что Netbeans — достаточно тормозная среда, поскольку работает в Java-машине. Поэтому, если она вам не подойдёт, ищите альтернативные кроссплатформенные варианты. Можно, например, заменить пакет Qt на Qt SDK, в который уже входит IDE Qt Creater. Но лично мне эта IDE не понравилась.

[Вернуться в начало]

Настройка переменных окружения

Прописываем в операционную систему переменные среды пользователя:

Мой компьютер → Свойства → Свойства системы → Дополнительно → Переменные среды
Переменная Значение (ваши пути могут отличаться)
QTDIR C:\Qt\4.6.0
MINGWDIR

C:\MinGW

PATH

%QTDIR%\bin;%MINGWDIR%\bin;%SystemRoot%\System32

QMAKESPEC

win32-g++

Переменная QMAKESPEC определяет, каким компилятором и в какой ОС будет проходить компиляция по умолчанию. Возможные значения этой переменной эквивалентны именам папок, расположенных в папке C:\Qt\4.6.0\mkspecs. В нашем случае мы используем компилятор g++ в операционной системе win32. После сохранения переменных среды пользователя они начинают действовать сразу во всех вновь открываемых программах, без перезагрузки операционной системы Windows XP.

[Вернуться в начало]

Создание Qt-проекта в Netbeans

Трудно что-либо добавить к официальной инструкции:

http://www.netbeans.org/kb/docs/cnd/qt-applications_ru.html.

[Вернуться в начало]

Установка в Qt Designer дополнительных компонентов

В визуальный редактор интерфейса Qt Designer можно установить дополнительные компоненты, скачав их, например, отсюда: http://qt.nokia.com/products/appdev/add-on-products/catalog/4. В Windows для Qt 4.5.2 существовала проблема их компиляции, заключающаяся в использовании прямых слешей для указания путей в make-файлах, тогда как Windows требовала обратные. Но в версии 4.6.0 эту ошибку исправили.

Методику компиляции и установки компонентов можно найти в прилагаемом к каждому компоненту текстовом файле INSTALL.TXT. В общем случае, следует открыть консоль в корневой папке компонента и выполнить сначала команду configure, ответив на вопрос «yes», затем qmake и make. Для того, чтобы компонент добавился в Qt Designer, следует перейти в папку plugin устанавливаемого компонента и повторить ввод команд qmake и make из неё. Затем, для использования компонента в проекте, в файлы qt-Release.pro и qt-Debug.pro нужно дописать строку вида:

    include(папка_дополнительных_компонентов/компонент/src/компонент.pri)

Это можно сделать через свойства проекта в Netbeans, выбрав в окне свойств категорию Build → Qt и прописав указанную строку в настройку Expert → Custom Definitions. Сделать это надо дважды: для режима Release и для режима Debug. Теперь в файле исходного кода, в котором вы будете обращаться к новому компоненту, достаточно прописать строку:

    #include <КлассКомпонента>
после чего уже можно будет работать с ним.

Замечу, что если команда make во время компиляции компонентов ругается на что-то, проверьте, тот ли файл запускается по этой команде (при наборе в терминале команды make -v она должна вывести своё имя — GNU Make). Если она выводит что-то типа «Borland - тра ля-ля», «Microsoft - тра ля-ля», или «CodeGear — тра ля-ля», значит запускается файл make от другой системы программирования, установленной на вашем компьютере ранее. В этом случае просто добавьте в начало системной переменной path путь к папке нужного нам файла, например: С:\msys\1.0\bin. Система использует файл, найденный в этой строке первым.

[Вернуться в начало]
[Оставить отзыв в гостевой]
Hosted by uCoz