[Развертывание приложений Qt]
Развертывание приложения в Windows
Этот документ описывает, как определить, какие файлы вы должны включить в ваш дистрибутив, и как убедиться, что приложение найдет их во время выполнения. Мы продемонстрируем процедуры на примере развертывания приложения Plug & Paint, которое находится в каталоге примеров Qt.
Содержание:
Статическая линковка
Если вы хотите хранить вещи простыми имея только несколько файлов для развертывания, т.е автономный исполняемый файл с DLL от конкретного компилятора, то вы должны собрать все статически.
Статическая сборка Qt
Прежде, чем мы сможем собрать наше приложение мы должны убедится, что Qt собрано статически. Чтобы сделать это, перейдите в командную строку и введите следующее:
cd C:\path\to\Qt
configure -static <любые другие параметры, необходимые вам>
Не забудьте определить любые другие параметры, которые вам нужны, такие как драйвера баз данных, в качестве аргументов для configure. Как только configure закончит работу, введите следующее:
nmake sub-src
Это соберет Qt статически. Заметьте, что в отличие от динамической сборки, в результате статической сборки Qt библиотеки будут без номера версии; например, вместо QtCore4.lib будет QtCore.lib. Кроме того, мы использовали nmake во всех примерах, но если вы используете MinGW вместо него, вы должны воспользоваться mingw32-make.
Замечание: Если позднее вам нужно будет переконфигурировать и пересобрать Qt в том же расположении, удостоверьтесь, что все следы предыдущей конфигурации удалены, для чего перейдите в каталог сборки и введите nmake distclean перед повторным запуском configure.
Линковка приложения со статической версией Qt
Как только закончится сборка Qt мы можем собрать приложение Plug & Paint. Сначала мы должны перейти в каталог, который содержит приложение:
cd examples\tools\plugandpaint
Затем мы должны запустить qmake, чтобы создать новый make-файл для приложения, и сделать чистую сборку, чтобы создать статически слинкованный исполняемый файл:
nmake clean
qmake -config release
nmake
Вы, вероятно, хотите линковать библиотеки в release режиме, и вы можете указать это при вызове qmake. Теперь, при условии, что все скомпилировалось и слинковалось без ошибок, мы должны получить файл plugandpaint.exe, который готов к развертыванию. Один простой способ проверить, что приложение действительно может быть запущено автономно - это скопировать его на машину, которая или не имеет Qt или не имеет установленных приложений Qt, и запустить его на этой машине.
Помните, что если ваше приложение зависит от библиотек компилятора, они должны распространяться вместе с вашим приложением. Вы можете проверить какие библиотеки подключает ваше приложение используя инструмент depends. Для получения дополнительной информации, смотрите раздел Зависимости приложения.
Пример Plug & Paint состоит из нескольких компонентов: Самого приложения (Plug & Paint) и подключаемых модулей Basic Tools и Extra Filters. Так как мы не можем развёртывать плагины, используя статический подход линковки, приложение, которое мы подготовили, неполноценно. Оно запустится, но функциональность будет отключена из-за недостающих плагинов. Для развертывания приложения на основе подключаемых модулей мы должны использовать подход с разделяемыми библиотеками.
Разделяемые библиотеки
У нас есть ещё две проблемы при развёртывании приложения Plug & Paint с использованием разделяемых библиотек: среда Qt должна быть правильно настроена для исполнения приложения, а также подключаемые модули должны быть установлены в правильную директорию в системе, чтобы приложение могло их найти.
Сборка Qt как разделяемой библиотеки
Мы предполагаем, что вы уже установили Qt как разделяемую библиотеку, которая по умолчанию устанавливается в папку C:\path\to\Qt. Для получения более подробной информации о том, как собрать Qt, смотрите документацию по Установке.
Линковка приложения с Qt как разделяемой библиотекой
После того, как мы убедились, что Qt собрана как разделяемая библиотека, мы можем собрать приложение Plug & Paint. Сначала мы должны перейти в каталог, который содержит приложение:
cd examples\tools\plugandpaint
Теперь запускаем qmake, чтобы создать новый make-файл для приложения, и делаем чистую сборку, чтобы создать динамически слинкованный исполняемый файл:
nmake clean
qmake -config release
nmake
Этим основное приложение будет собрано, далее собираем подключаемые модули:
cd ..\plugandpaintplugins
nmake clean
qmake -config release
nmake
Если все скомпилировалось и слинковалось без ошибок, мы получим исполняемый файл plugandpaint.exe и файлы подключаемых модулей pnp_basictools.dll и pnp_extrafilters.dll.
Создание пакета приложения
Для развертывания приложения, мы должны убедиться, что мы скопировали DLL Qt (соответствующие используемым в приложении модулям Qt) так же, как и исполняемый файл, в ту же директорию в поддиректорию release.
Помните, что если ваше приложение зависит от библиотек компилятора, они должны быть распространены вместе с вашим приложением. Вы можете проверить какие библиотеки подключает ваше приложение используя инструмент depends. Для получения дополнительной информации, смотрите раздел Зависимости приложения.
Мы коротко осветим подключаемые модули, но сначала проверим работоспособность приложения в развертываемом окружении: Либо скопируем исполняемый файл и библиотеки DLL Qt на машину без Qt и любых установленных приложений Qt, либо, если вы хотите провести тест на той же машине, где проводилась сборка, убедитесь, что в окружении этой машины нет Qt.
Если приложение запускается без каких-либо проблем, значит мы успешно получили динамически слинкованную версию приложения Plug & Paint. Но функциональность приложения по-прежнему отсутствует, так как мы еще не развернули связанные подключаемые модули.
Подключаемые модули работают иначе, чем обычные DLL, поэтому мы не можем просто скопировать их в тот же каталог, что и наш исполняемый файл, как мы поступили с DLL Qt. Когда ищутся подключаемые модули, приложение ищет в подкаталоге plugins внутри каталога с исполняемым файлом.
Поэтому, чтобы сделать для нашего приложения подключаемые модули доступными, мы создадим подкаталог plugins и скопируем соответствующие DLL:
plugins\pnp_basictools.dll
plugins\pnp_extrafilters.dll
Распространяемый архив со всеми Qt DLL и специальные подключаемые модули приложения, требующими запуска приложения Plug & Paint, должен содержать следующие файлы:
Компонент | Имя файла |
Исполняемый файл | plugandpaint.exe |
Подключаемый модуль основных инструментов | plugins\pnp_basictools.dll |
Подключаемый модуль ExtraFilters | plugins\pnp_extrafilters.dll |
Модуль Qt Core | qtcore4.dll |
Модуль Qt GUI | qtgui4.dll |
Кроме того, архив должен содержать следующие специальные библиотеки компилятора, зависящие от вашей версии Visual Studio:
| VC++ 6.0 | VC++ 7.1 (2003) | VC++ 8.0 (2005) |
The C run-time | msvcrt.dll | msvcr71.dll | msvcr80.dll |
The C++ run-time | msvcp60.dll | msvcp71.dll | msvcp80.dll |
Чтобы проверить, что приложение теперь можно успешно развертывать, распакуйте этот архив на машине без Qt и любых установленных компиляторов и попробуйте запустить его.
Альтернативой помещению подключаемых модулей в подкаталог является добавление пользовательского пути поиска при запуске вашего приложения используя QApplication::addLibraryPath() или QApplication::setLibraryPaths().
qApp->addLibraryPath("C:\some\other\path");
Одним из преимуществ использования подключаемых модулей является то, что из легко можно сделать доступными для целого семейства приложений.
Более удобным часто бывает добавление пути в функцию приложения main(), сразу после создания объекта QApplication. Раз путь добавлен, то приложение будет искать там свои подключаемые модули, кроме как в подкаталоге plugins собственного каталога приложения. Может быть добавлено любое количество дополнительных путей.
Visual Studio 2005
Когда развертываемое приложение компилируется с помщоью Visual Studio 2005 требуется рассмотреть несколько дополнительных соображений.
Во-первых, нам нужно скопировать файл манифеста,созданный при линковке приложения. Этот файл манифеста содержит информацию о зависимостях приложения в расположенных рядом сборках (side-by-side assemblies), таких как библиотеки времени выполнения. Файл манифеста необходимо скопировать в тот же каталог, что и исполняемый файл приложения. Вам не нужно копировать файлы манифеста для разделяемых библиотек (DLL), поскольку они не используются ими. Если разделяемая библиотека имеет зависимости, отличные от использующего ее приложения, то файл манифеста необходимо встроить в двоичный код DLL. В Qt 4.1.3 и позднее мы имеем следующие опции CONFIG для встраивания манифестов:
embed_manifest_dll
embed_manifest_exe
Для использования опции добавьте
CONFIG += embed_manifest_exe
в ваш .pro-файл. Опция embed_manifest_dll разрешена по умолчанию.
Вы можете найти больше информации о файлах манифеста и расположенных рядом сборках на веб-сайте MSDN.
Имеется два способа включения библиотек времени выполнения: непосредственное связывание их с вашим приложением или их установкой на системе конечного пользователя.
Для связывания библиотек времени выполнения с вашим приложением скопируйте каталог
<Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC80.CRT
в каталог с вашим исполняемым файлом, так что вы включили каталог Microsoft.VC80.CRT поблизости от исполняемого файла вашего приложения. Если связали библиотеки времени выполнения и к том уже нужно развернуть подключаемые модули, то из подключаемых модулей вам нужно удалить манифест (встроенный как ресурс) добавив это в pro-файл подключаемых модулей, которые вы компилируете:
CONFIG-=embed_manifest_dll
Если этого не сделать подключаемые модули нельзя будет загрузить на некоторых системах.
Для установки библиотек времени выполнения на системе конечного пользователя, вам нужно включить соответствующий исполняемый файл Visual C++ Redistributable Package (VCRedist) вместе с вашим приложением и убедиться, что он будет запущен когда пользователь будет устанавливать ваше приложение.
Например, для 32-битной x86-совместимой системе, вы должны включить исполняемый файл vcredist_x86.exe. Исполняемые файлы vcredist_IA64.exe и vcredist_x64.exe предоставляют соответствующие библиотеки для IA64 и 64-битной x86 архитектур соответственно.
Зависимости приложения
Дополнительные библиотеки
Специфичные библиотеки компилятора, зависящие от конфигурации, должны распространяться вместе с вашим приложением. Вы можете проверить какие библиотеки слинкованы с вашим прилжоением с помощью инструмента Dependency Walker. Все что вам нужно - это запустить его примерно так:
depends <исполняемый файл приложения>
Это предоставит список библиотек, от которых зависит ваше приложение, и другую информацию.
Если с помощью инструмента depends изучить release-сборку исполняемого файла Plug & Paint (plugandpaint.exe), то инструмент перечислит следующие непосредственные зависимости от несистемных библиотек:
Qt | VC++ 6.0 | VC++ 7.1 (2003) | VC++ 8.0 (2005) | MinGW |
- QTCORE4.DLL - Библиотека времени выполнения QtCore
- QTGUI4.DLL - Библиотека времени выполнения QtGui
|
- MSVCRT.DLL - Библиотека времени выполнения C
- MSVCP60.DLL - Библиотека времени выполнения C++ (только если установлена STL)
|
- MSVCR71.DLL - Библиотека времени выполнения C
- MSVCP71.DLL - Библиотека времени выполнения C++ (только если установлена STL)
|
- MSVCR80.DLL - Библиотека времени выполнения C
- MSVCP80.DLL - Библиотека времени выполнения C++ (только если установлена STL)
|
- MINGWM10.DLL - Библиотека времени выполнения MinGW
|
Если изучить файлы DLL подключаемого модуля будут перечислены точно такие же зависимости.
Подключаемые модули Qt
Ваше приложение может также зависить от одного или более подключаемых модулей Qt, таких как подключаемый модуль формата изображения JPEG или подключаемый модуль драйвера SQL. Убедитесь, что вы распространяете все необходимые вашему приложению подключаемые модули Qt, и обратите внимание на то, что каждый тип подключаемого модуля должен находиться внутри специального подкаталога (таких как imageformats или sqldrivers) в вашем каталоге, как описано ниже.
Путь поиска для подключаемых модулей Qt (так же как несколько других путей) жестко запрограммировано в библиотеке QtCore. По умолчанию, первым путем поиска подключаемого модуля будет жестко запрограммированный подкаталог установки Qt plugins:
C:<path to Qt>\plugins
Предопределенные пути вроде этого имеют некоторые неудобства. Например, они могут не существовать на целевой машине. По этой причине вам нужно изучить различные альтернативы, чтобы обеспечить нахождение подключаемых модулей Qt:
Документ Как создавать плагины Qt очертит вопросы, которым вам нужно уделить внимание при разработке и распространении подключаемых модулей для приложений Qt.
[Развертывание приложений Qt]
|