Оглавление
Развертывание приложения в 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, должен содержать следующие файлы:
Кроме того, архив должен содержать следующие специальные библиотеки компилятора, зависящие от вашей версии Visual Studio:
Чтобы проверить, что приложение теперь можно успешно развертывать, распакуйте этот архив на машине без Qt и любых установленных компиляторов и попробуйте запустить его. Альтернативой помещению подключаемых модулей в подкаталог является добавление пользовательского пути поиска при запуске вашего приложения используя QApplication::addLibraryPath() или QApplication::setLibraryPaths(). qApp->addLibraryPath("C:\some\other\path"); Одним из преимуществ использования подключаемых модулей является то, что из легко можно сделать доступными для целого семейства приложений. Более удобным часто бывает добавление пути в функцию приложения main(), сразу после создания объекта QApplication. Раз путь добавлен, то приложение будет искать там свои подключаемые модули, кроме как в подкаталоге plugins собственного каталога приложения. Может быть добавлено любое количество дополнительных путей. Visual Studio 2005 OnwardsПри развертывании приложения, скомпилированного с помощью Visual Studio 2005 onwards, принимается несколько дополнительных шагов. Во-первых, нам нужно скопировать файл манифеста,созданный при линковке приложения. Этот файл манифеста содержит информацию о зависимостях приложения в расположенных рядом сборках (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 разрешена по умолчанию. Опция embed_manifest_exe НЕ разрешена по умолчанию. Вы можете найти больше информации о файлах манифеста и расположенных рядом сборках на веб-сайте MSDN. Правильный способ включения библиотек времени выполнения в ваше приложение заключается в проверке того, что они установлены в системе конечного пользователя. Для установки библиотек времени выполнения системе конечного пользователя, вам нужно включить соответствующий исполняемый файл Visual C++ Redistributable Package (VCRedist) в ваше приложение убедиться, что он запускается при установке приложения пользователем. Например, для 32-битной x86-совместимой системе, вы должны включить исполняемый файл vcredist_x86.exe. Исполняемые файлы vcredist_IA64.exe и vcredist_x64.exe предоставляют соответствующие библиотеки для IA64 и 64-битной x86 архитектур соответственно. Замечание: Распространяемое вами приложение должно компилироваться с в точности той же версией компилятора вместе с той же версией времени выполнения Cи. Это предотвращает ошибки развертывания, вызываемых разными версиями библиотек времени выполнения Cи. Visual Studio 2008 и ручная установкаЗдесь, как и выше подробности для VS 2005 и последующих версий, приложения Visual Studio 2008 могут иметь проблемы, при развёртывании вручную, скажем на USB-накопитель. Рекомендуемая процедура - сконфигурировать Qt с параметром -plugin-manifests, используя инструмент 'configure'. Затем следуйте руководству по ручному развёртыванию частных сборок (private assemblies). Вкратце шаги следующие
Теперь запустить ваше приложение. Также помните, что даже с установленным пакетом обновления библиотеки DLL Windows, с которыми производится линковка, будут стандартными. Смотрите информацию как выбрать подходящие целевые DLL. Зависимости приложенияДополнительные библиотекиСпецифичные библиотеки компилятора, зависящие от конфигурации, должны распространяться вместе с вашим приложением. Вы можете проверить какие библиотеки слинкованы с вашим прилжоением с помощью инструмента Dependency Walker. Все что вам нужно - это запустить его примерно так: depends <исполняемый файл приложения> Это предоставит список библиотек, от которых зависит ваше приложение, и другую информацию. Если изучить release-сборку исполняемого файла Plug & Paint (plugandpaint.exe) с помощью инструмента depends, то инструмент перечислит следующие непосредственные зависимости от несистемных библиотек:
Если изучить файлы DLL подключаемого модуля будут перечислены точно такие же зависимости. Подключаемые модули QtВаше приложение может также зависеть от одного или более подключаемых модулей Qt, таких как подключаемый модуль формата изображения JPEG или подключаемый модуль драйвера SQL. Убедитесь, что вы распространяете все необходимые вашему приложению подключаемые модули Qt, и обратите внимание на то, что каждый тип подключаемого модуля должен находиться внутри специального подкаталога (таких как imageformats или sqldrivers) в вашем каталоге, как описано ниже. Замечание: Если вы развёртываете приложение, которое использует QtWebKit, чтобы отображать HTML-страницы из интернета, то вы должны включить все подключаемые модули текстовых кодеков, чтобы поддержать настолько много HTML-кодировок насколько это возможно. Путь поиска для подключаемых модулей жестко запрограммировано в библиотеке QtCore. По умолчанию, подкаталог подключаемых модулей в каталоге установленной Qt является первым в пути поиска подключаемого модуля. Тем не менее, заранее заданные пути, аналогичные пути по умолчанию, имеют определённые недостатки. Например, они могут не существовать на целевой машине. По этой причине вам нужно изучить различные альтернативы, чтобы обеспечить нахождение подключаемых модулей Qt:
Если вы добавили свой путь используя QApplication::addLibraryPath он может выглядеть примерно так: qApp->addLibraryPath("C:/customPath/plugins"); Затем qApp->libraryPaths() возвратит что-нибудь такое: "C:/customPath/plugins " "C:/Qt/4.7.4/plugins" "E:/myApplication/directory/" Исполняемый файл будет искать подключаемые модули в этих каталогах и том же порядке, в каком они упорядочены в QStringList, возвращённом qApp->libraryPaths(). Вновь добавленные пути добавляются в начало qApp->libraryPaths(), что означает, что поиск будет идти начиная с первого. Однако, если вы используете qApp->setLibraryPaths(), вы должны быть способны определить, в каких путях и в каком порядке будем их искать. Документ Как создавать плагины Qt очертит вопросы, которым вам нужно уделить внимание при разработке и распространении подключаемых модулей для приложений Qt. Связанные сторонние ресурсы
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |