Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

[Развертывание приложений Qt]

Развертывание приложения на 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

Как только закончится сборка 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
Подключаемый модуль ExtraFiltersplugins\pnp_extrafilters.dll
Модуль Qt Coreqtcore4.dll
Модуль Qt GUIqtgui4.dll

Кроме того, архив должен содержать следующие специальные библиотеки компилятора, зависящие от вашей версии Visual Studio:

VC++ 6.0VC++ 7.1 (2003)VC++ 8.0 (2005)
The C run-timemsvcrt.dllmsvcr71.dllmsvcr80.dll
The C++ run-timemsvcp60.dllmsvcp71.dllmsvcp80.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), то инструмент перечислит следующие непосредственные зависимости от несистемных библиотек:

QtVC++ 6.0VC++ 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. Be sure to distribute any Qt plugins that you need with your application.

Путь поиска для подключаемых модулей Qt (так же как несколько других путей) жестко запрограммировано в библиотеке QtCore. По умолчанию, первым путем поиска подключаемого модуля будет жестко запрограммированный подкаталог установки Qt plugins:

 C:<path to Qt>\plugins

Предопределенные пути вроде этого имеют некоторые неудобства. Например, они могут не существовать на целевой машине. По этой причине вам нужно изучить различные альтернативы, чтобы обеспечить нахождение подключаемых модулей Qt:

[Развертывание приложений Qt]


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5