Главная > Решения > Компилирование библиотеки Qt под ОС Windows с поддержкой Phonon

Компилирование библиотеки Qt под ОС Windows с поддержкой Phonon

В этой статье я расскажу как скомпилировать Qt с поддержкой Phonon.

Итак, давайте сначала разберёмся как всё это будет выглядеть. Библиотеки QtWebKit и Phonon не являются собственностью Qt. Они были включены в него под «свободной лицензией». В связи с этим компилирование обоих этих библиотек возможно только в shared-версии. Из этого можно сделать вывод, что про необходимости использования любой из этих библиотек статичную сборку делать бесполезно.

Также надо заметить, что Phonon использует DirectShow, который поддерживает только свой, «родной» компилятор — nmake (поставляется с некоторыми SDK фирмы Microsoft и, естественно, с Microsoft Visual C++).

Итак, решено! Мы будем использовать nmake и делать shared-сборку :D


Ориентируемся на…

Скажем просто: на какие версии ОС мы собираемся ориентировать нашу программу (на release-стадии, конечно).

Для Windows Vista и ниже (XP например) отлично подойдёт MSVC2005 и Platform SDK для 2003-го сервера. Для самых новых (Vista, Se7en) предпочтительнее брать более новые продукты: MSVC2008 и Platform SDK для 2008-го сервера.

Исходя из этой информации необходимо принять решение о загрузке того или иного ПО из списка ниже.

Также настоятельно рекомендую прочитать «О зависимостях».

А что нам, собственно, нужно?..

Сначала скачаем всё, чтобы потом не отвлекаться во время установки на ожидание загрузки очередного очень нужного компонента.

  1. Для начала — сам Qt. Берём его здесь, на официальном сайте. Я не даю прямую ссылку на файл, потому что может произойти так, что из-за меня кто-нибудь скачает древнюю версию, что не красиво. На момент написания статьи была использована версия 4.5.2. Выбираем zip-архив с именем qt-win-opensource-src-%версия%.zip, где %версия% — смотрим самую новую.
  2. Ещё Microsoft Visual C++ Express Edition, чтоб было всё бесплатно %). Версию 2005 года можно найти поиском, а вот версия 2008 года вполне доступна с сайта самой компании. Самое интересное заключается в том, что абсолютно непонятно какая между ними разница, кроме, конечно, постепенно деградирующего интерфейса… Я использую MSVC версии 2005 года и вполне ей доволен. Что касается более новых версий Windows (Windows Vista и Windows Se7en), то не могу однозначно сказать на сколько программа скомпилированная под MSVC2005 будет там работоспособна. На Vista точно будет работать, а вот про Se7en: чего не знаю — того не знаю.
  3. Также нам понадобиться Microsoft Platform SDK for Server. Здесь тоже много версий: Windows Server 2003 R2 Platform SDK ISO Download и Windows SDK for Windows Server 2008 and .NET Framework 3.5. Здесь история аналогичная Microsoft Visual C++. У меня версия опять древняя — 2003 года.

На этом минимальный набор всякого снаряжения подошёл к концу. Но, лично я хочу рассмотреть компиляцию с поддержкой шифрования (OpenSSL) и хочу его собрать сам. Здесь происходит самое интересное: сборка OpenSSL под Windows, которую можно найти по запросу openssl windows, сделана как раз с зависимостью от этого пакета. Чтож, пересоберём как нам надо! :)

Итак, дополнительный список вооружения:

  1. Сами исходные коды OpenSSL берём здесь. Как всегда советую брать новейшую версию. На момент написания последней стабильной версией была 0.9.8k.
  2. Microsoft Macro Assembler (MASM), доступный на официальном сайте (8-ая версия). Этот пакет необходим для сборки OpenSSL. Здесь также необходимо выбирать версию, соответствующую вашей Visual C++. Но вот 9-ой версии (для MSVC2008) что-то я у них не нашёл.
  3. ActivePerl берём тут. Он также необходим для компилирования OpenSSL.

Вроде, ничего не забыли :)

О том, куда устанавливать

Иногда случаются такие ситуации, когда надо что-то найти, а никто не знает где это лежит. Для этого я считаю очень удобным, чтобы всё ПО какой-то определённой тематики (особенно, если его так много как здесь) валялось в одной папке. Для себя я определился, что этой самой папочкой станет C:\Development для всяких SDK и папочка C:\Qt\%версия% для всяких Qt (у меня это выглядит так: C:\Qt\4.5.2).

Удобно, не правда ли? :)

Установка Windows Server 2003 R2 Platform SDK

В связи с «О том, куда устанавливать» устанавливаем в C:\Development\Microsoft Platform SDK for Windows Server 2003 R2.

Поскольку мало кто полезет читать документацию к этому SDK или же кто захочет поглазеть на примеры исходных кодов, то они нам не нужны и мы их выкидываем (также выкидываем всевозможные тулзы и снаряжения для ненужных процессоров).

Установка Platform SDK

Установка Platform SDK

Всё, устанавливаем.

Установка ActivePerl

Здесь не важно куда и как вы его установите. Главное галочку напротив вопроса о добавлении в %PATH% не убирайте :)

Установка DirectX SDK

Здесь всё аналогично установке Platform SDK. Адрес установки: C:\Development\Microsoft DirectX SDK (March 2009).

Установка DirectX SDK

Установка DirectX SDK

Установка Visual C++ 2005 Express Edition

Здесь следует помнить, что Express Edition — единственный бесплатный вариант. Чтобы избежать всевозможных проблем следует устанавливать именно её.

Из этого пакета нам однозначно не нужна справочная библиотека MSDN и SQL Server. Выкидываем их.

Компонент Graphical IDE мы оставляем. Нет, ничего писать в нём мы не собираемся, просто есть маленькая программка (mt.exe кажется), без которой компилятор будет плакать как маленький.

Установка Visual C++ 2005 Express Edition

Установка Visual C++ 2005 Express Edition

Будут установлены следующие компоненты: MSVC2005 и .Net Framework v2.0 (он, кстати, тоже крайне необходим). Адрес установки, для удобства, я назначил C:\Development\VC.

Обновлять всё это дело до SP1 не рекомендую. Я долго шарился по интернету в поисках решений своих ошибок при первых попытках скомпилировать Phonon и прочитал, что с SP1 может возникнуть конфликт при сборке Qt. Хотя, это было уже достаточно давно, может уже исправили.

Установка Microsoft Macro Assembler

Здесь вообще не предлагается никакая свобода выбора. Просят только принять лицензию. Для любопытных умов: он установился в папку к VC и называется ml.exe.

Компилирование и установка OpenSSL

Вот, мы уже близки к завершению подготовки перед компиляцией Qt :)

Сначала распакуем архив с OpenSSL куда-нибудь, например в C:\openssl-0.9.8k, запустим скрипт, устанавливающий окружение MSVC (Пуск -> Все программы -> Microsoft C++ 2005 Express Edition -> Visual Studio Tools -> Visual Studio 2005 Command Prompt или аналогичный, в зависимости от версии) и перейдём с помощью команды cd C:\openssl-0.9.8k в каталог с исходными кодами OpenSSL.

Вот сейчас нам как раз понадобится Perl, MASM и nmake все сразу. Начнём.

Конфигурируем OpenSSL, выполнив следующую команду в командной строке:


perl Configure VC-WIN32 --prefix=C:/Development/OpenSSL

Естественно, значение параметра -prefix= в соответствии нуждам. Также стоит обратить внимание на то, что используется слеш (а не обратный слеш как во всех других местах). Невыполнение этого правила приведёт к краху сборки.

Теперь выполняем команду


ms\do_masm

и


nmake -f ms\ntdll.mak

Началась сборка библиотек OpenSSL, по окончанию которых можно проверить их работоспособность выполнив команду


nmake -f ms\ntdll.mak test

По окончании проверки в консоль будет выведена информации об успешном (или не успешном) завершении проверки работоспособности библиотек.

Всё, устанавливаем (фактически копируем) необходимые файлы (в папку указанную при конфигурировании в -prefix=), выполнив в консоли команду:


nmake -f ms\ntdll.mak install

Всё. Теперь нам больше не понадобится ни MASM, ни ActivePerl, ни даже папка в которой мы сейчас находимся вместе с архивом с исходниками OpenSSL.

Создание файла настроек окружения

Делается это просто: методом создания файла командной строки.

Создадим файл C:\Development\SetEnv.cmd.

Теперь напишем скрипт установки всех частей окружения вручную, с нуля. Мой вариант:

@ECHO OFF

@set DEV=C:\Development
@set PATH=%SystemRoot%;%SystemRoot%\system32
@set QTDIR=C:\Qt\4.5.2

@echo Setting OpenSSL Env.
@set PATH=%DEV%\OpenSSL\bin;%PATH%
@set LIB=%DEV%\OpenSSL\lib
@set INCLUDE=%DEV%\OpenSSL\include

@echo Setting DirectX Env.
@set LIB=%DEV%\Microsoft DirectX SDK (March 2009)\Lib\x86;%LIB%
@set INCLUDE=%DEV%\Microsoft DirectX SDK (March 2009)\Include;%INCLUDE%

@echo Setting Windows SDK Env.
@set LIB=%DEV%\Microsoft Platform SDK for Windows Server 2003 R2\Lib;%LIB%
@set INCLUDE=%DEV%\Microsoft Platform SDK for Windows Server 2003 R2\Include;%INCLUDE%
@set CPU=i386
@set NODEBUG=1

@echo Setting MSVC2005 Env.
@set PATH=%DEV%\VC\VC\bin;%DEV%\VC\Common7\Tools;%DEV%\VC\Common7\IDE;%DEV%\VC\VC\VCPackages;%PATH%
@set INCLUDE=%DEV%\VC\VC\INCLUDE;%INCLUDE%
@set LIB=%DEV%\VC\VC\LIB;%LIB%

@echo Setting Framework Env.
@set FrameworkVersion=v2.0.50727
@set FrameworkDir=%SystemRoot%\Microsoft.NET\Framework
@set PATH=%DEV%\VC\SDK\v2.0\Bin;%PATH%
@set LIB=%DEV%\VC\SDK\v2.0\Lib;%LIB%
@set LIBPATH=%FrameworkDir%\%FrameworkVersion%
@set PATH=%LIBPATH%;%PATH%

@echo Setting Qt Env.
@set PATH=%QTDIR%\bin;%PATH%

@title Qt Framework 4.5.2 Development Kit.

cd %QTDIR%

Здесь применены временный переменные, к примеру %DEV% чтобы сократить остальную писанину.

Объяснять что здесь что я не буду. Хочу лишь обратить внимание на установку снаряжения Windows SDK и Framework.

В Windows SDK есть переменные CPU и NODEBUG, отвечающие за Retail и Debug сборку, а также за архитектуру.

В Framework необходимо проверить правильность всех этих переменных в соответствии окружению. У меня, при использовании MSVC2005 они такие, как написано. Если при компиляции возникнет ошибка, что не найден файл с именем mscoree, то ошибку следует искать именно здесь.

Чтобы легко использовать это окружение, можно создать на него ярлык. Здесь стоит заметить, что ярлык должен быть «особенным», так как при простом запуске этого файла он выполнится, после чего окно просто закроется. Чтобы этого не случилось делаем так: создаём ярлык в удобном нам месте (правой кнопкой мышки -> Создать -> Ярлык…), выбираем путь к файлу и приписываем к нему слево %comspec% /k. Получится примерно так: %comspec% /k C:\Development\SetEnv.Cmd.

Создания ярлыка

Создания ярлыка

Последний этап подготовки перед компилированием Qt завершён.

Сборка Qt

Вот и всё, всё снаряжение готово к бою :)

Итак, первым делом следует распаковать Qt из скачанного архива в необходимую папку (C:\Qt\4.5.2 в моём случае) и произвести предварительные настройки для компилятора.

Чтобы произвести настройку компилятора, надо отредактировать файл конфигурации qmake.txt, расположенный в папке mkspecs\%компилятор%, где %компилятор% — версия нашего компилятора (для MSVC2005 оно равно win32-msvc2005, а для MSVC2008 — win32-msvc2008). Открываем этот документ в текстовом редакторе и ищем следующие строчки (они могут немного отличаться):


QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_DEBUG = -Zi -MDd

Если обладаем многоядерным процессором, то можно компилировать в несколько потоков. Для этого используется флаг -MPi, где i – количество процессоров (для 2-х-ядерного процессора это будет выглядеть так: -MP2). Этот флаг можно добавить и в release, и в debug флаги.

Примечание: если файл конфигурации содержит флаг -GL (оптимизация всей программы), то удалите его. Этот флаг потенциально может создать конфликт при компиляции QtWebKit.

После всех наших преобразований эти строки будут выглядеть примерно так:


QMAKE_CFLAGS_RELEASE = -O2 -MD -MP2
QMAKE_CFLAGS_DEBUG = -Zi -MDd -MP2

Некоторые из вас могут спросить, мол, а не лучше ли заменить флаг -O2 на, к примеру, -Os (по аналогии с компилятором g++)? Отвечу: нет, не лучше. Для компилятора nmake этот флаг эквивалентен флагу -O1. Подробнее об этом можно почитать тут, на сайте MSDN.

Распинаться на тему того, какие флаги использовать при конфигурировании Qt я не буду. Просто скажу, что бывают случаи, когда конфигуратор по каким-то причинам не видит возможности использовать тот или иной флаг. Поэтому следует указать все. Здесь приведу свой набор флагов:


configure -debug-and-release -shared -exceptions -accessibility -stl -plugin-sql-sqlite -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-dsp -no-vcproj -mmx -3dnow -sse -sse2 -direct3d -openssl -no-dbus -phonon -phonon-backend -webkit -scripttools -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde

Итак, можно начинать конфигурирование и компилирование qmake.exe. Для этого запустим наш скрипт SetEnv.cmd через ярлык и вставим туда команду, написанную выше.

Выполнение конфигурирования

Выполнение конфигурирования

После компилирования qmake.exe с его помощью будут созданы make-файлы для всех проектов (начиная от самой библиотеки Qt и заканчивая простейшими примерами). Здесь существует вероятность, что нет необходимости компилировать вообще всё подряд. К примеру нужна просто release-версия библиотеки для компилирования release-версий каких-либо программ. То есть не для разработки.

Если есть какая-то необходимость компилировать не весь Qt, а по частям, то используются специальные «флаги», определённые в основном файле проекта Qt. Вот 2 основных из них:

  1. nmake sub-src — для компилирования только библиотек;
  2. nmake sub-tools — для компилирования всевозможных утилит (Designer, Linguist, Assistant, etc.).

По завершению конфигурирования, создания qmake.exe и make-файлов для проекта, Qt скажет, что «Qt is now configured for building. Just run nmake. To reconfigure, run nmake confclean and configure». Можно приступать к сборке :)

Для того, чтобы начать компилирование просто введите nmake (или nmake sub-src и потом, если надо, nmake sub-tools) в зависимости от необходимого результата.

Если интересно, то я выполнил поочерёдно команды nmake sub-src и nmake sub-tools чтобы получить библиотеку с тулзами, но без ненужных примеров.

…Прошло n-ое время, затраченное на компилирование нужных компонентов…

По завершению операций консоль не закрываем.

Проверка работоспособности библиотеки

Здесь всё просто. Раз мы собирали Qt в основном из-за модуля Phonon, то его и будем проверять.

Для этого выполним следующую команду, по завершении которой скомпилируется и запустится демо-приложение, использующее Phonon:


cd demos/mediaplayer && qmake && nmake release && cd release && mediaplayer

Через несколько секунд после завершения выполнения этого набора команд запуститься приложение. Откроем в нём какой-нибудь аудио файл, например: любимую песню :) На этом моменте все поймут, работает Phonon или нет.

Демо-приложение: Media Player

Демо-приложение: Media Player



Оговорки

  • В «Проверке работоспособности библиотеки» запуск приложения выполнен через консоль. Если попытаться запустить скомпилированную программу через проводник (при условии, что она находится не в директории bin Qt), то ничего не получится. Чтобы это исправить, необходимо перенести все переменные окружения из SetEnv.cmd в глобальное окружение ОС (Пуск -> Панель управления -> Система -> вкладка «Дополнительно» -> Переменные среды).
  • В случае возникновения ошибки при проверки работоспособности Phonon не следует огорчатся. Иногда так случается, что по каким-то причинам воспроизведение невозможно. Не знаю почему. просто попробуйте воспроизвести другой файл.


О зависимостях

Чтобы убрать зависимости от redistributable-пакетов необходимо заменить флаг -MD (-MDd) на -MT (-MTd).

Тут некоторые задумались на тему того, почему этот вопрос был вынесен из самой «инструкции» и являет собой нечто, похожее на дополнение. А кто-то, пропустив ссылку сюда сильно расстроен. Чтож, объясняю.

Использование флага -MT подразумевает собой «вшивание» кода runtime-библиотеки в конечный продукт (и в библиотеки, и в программы). Но при этом возникает обидная неожиданность: очень часто программы не работают. У меня лично хронически не запускался QtDesigner и lrelease (может что-нибудь ещё, а я просто не в курсе).

Именно по-этому я вынес этот вопрос сюда. В принципе, никто не мешает попытаться сделать -MT на более свежих версиях. У меня вот не срослось. Кстати, если надумали делать, то в OpenSSL тоже придётся внести небольшие изменения: в файле ms\ntdll.mak исправить /MD на /MT. Делать это необходимо после выполнения команды

ms\do_masm

О зависимостях готовых приложений можно почитать тут [на англ.].

Вернуться вверх, к «Ориентируемся на…»

  1. 26 Июнь 2009 в 19:31 | #1

    Ух ты, я нашёл ссылку на MSVC2005 :)
    Вот она: http://download.microsoft.com/download/A/9/1/A91D6B2B-A798-47DF-9C7E-A97854B7DD18/VC.iso

    Кстати, я вот понять не могу, я уже много раз собирал Qt с помощью nmake и ещё ни разу не получил нормальной сборки.
    Вот только что пытался собрать QtCreator версии 1.2.0 (что касается меня, то я считаю эту среду разработки лутшей для Qt :) ) и, удачно завершив сборку, программа не работает :(

  1. Пока что нет уведомлений.
Необходимо войти на сайт, чтобы написать комментарий.