Распространение приложений для Windows

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
Image:qt-logo_new.png Image:qq-title-article.png
Qt Quarterly | Выпуск 10 | Документация


от Andy Shaw

Эта статья является второй в серии из трех статей, охватывающих распространение приложений Qt на различных платформах. Основной упор делается на систему Windows. Точно так же, как приложения ОС Mac X, распространение приложений под систему Windows не требует никаких навыков в программировании на C++. Все, что вам нужно сделать - это собрать Qt и ваше приложение в режиме релиза, также следуют придерживаться процедур, описанных в этой статье. Мы продемонстрируем примеры прикладных показательных программ, которые располагаются в директории Qt examples.

Содержание


[править] Статические связи

Если вы хотите, чтобы все было просто, имея только единый запускаемый файл, т.е. автономную выполняемую программу, то вы должны настроить некоторые параметры. Как со статической линковкой на Mac ОС X, преимущества - то, что приложение загрузится и выполнится быстрее, потому что все символы находятся в выполняемой программе. Недостатки - это возрастание размера выполняемой программы, и факт, что вы не можете использовать дополнений (плагинов) к программе.

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

cd %QTDIR%
configure -static <и другие нужные вам параметры >

Помните, определяя другие разные варианты, которые вам нужны, как, например, поддержка потоков, вам требуется указать соответствующие аргументы для configure. Как только configure отработает, вам требуется набрать следующее:

make sub-src

Таким образом, Qt будет собран в статическом режиме релиза. [1] Как только Qt собрана, вы можете приступить к сборке приложения showimg.

Для начала мы должны зайти в директорию, который содержит приложения, которое мы хотим запустить:

cd examples\showimg

Мы должны теперь выполнить команду qmake, чтобы создать новый makefile для прикладной программы, и сделать очистку билда, чтобы создать статически связанный выполняемый модуль:

qmake showimg.pro
make clean
make

Теперь, при условии, что все откомпилировано и связано без каких-либо ошибок, мы должны получить файл showimg.exe, который готов для запуска. Единственный наиболее простой путь для проверки, что приложение действительно может быть запущено как автономное приложение - скопировать его на машину, на которой не установлена Qt или какие-либо приложения Qt, и выполнить это приложение на этой машине.

[править] Открытые библиотеки

Если вы не хотите использовать статические связи, например, потому что вы хотите использовать плагины, или потому что вы хотите использовать ту же самую Qt DLL для пакета программ, то решение состоит в том, чтобы использовать общедоступную библиотеку.

Как и при использовании статической связи, прежде чем мы можем приступить к сборке нашей прикладной программы, мы должны удостовериться в том, что Qt собрана как общедоступная библиотека. Чтобы настроить данный параметр, требуется перейти в режим командной строки и набрать следующее:

cd %QTDIR%
configure -shared < и другие нужные вам параметры >

Помните - для использования других параметров, которые вам требуются, нужно указать их, перечислив после параметра configure. Так как мы все еще используем приложение showimg в качестве примера, мы так же определим plugin-imgfmt-jpeg как одну из опций, таким образом, она окажется в списке плагинов. Когда configure отработает, требуется набрать следующее:

make sub-plugins

Таким образом, мы собрали Qt как общедоступную библиотеку в режиме релиза, и установили дополнительный формат изображения JPEG для использования в программе. Когда Qt будет полностью собрана, мы можем запустить программу showimg. Сначала мы должны войти в каталог, который содержит прикладную программу, которую мы хотим запустить, для этого требуется выполнить следующее:

cd ..\examples\showimg


Теперь выполните qmake, чтобы создать новый makefile для прикладной программы, и очистить билд, чтобы создать динамически связанную выполняемую программу:

qmake showimg.pro
make clean
make

Если все откомпилировано и связано без ошибок, мы получим файл showimg.exe. Чтобы запустить программу, мы должны убедиться, что Qt DLL находится в той же директории, что и выполняемая программа. Для начала мы проверим, что приложение будет работать на разных платформах. Берем и копируем выполняемую программу и Qt DLL на машину, на которой не установлена Qt или какие-либо приложения Qt. Если вы хотите протестировать все на своей машине, удалите переменную окружения QTDIR и удалите %QTDIR%\bin из переменной окружения PATH..

Мы должны получить выполняемую программу showimg.exe и Qt DLL (напр., qt331.dll, если вы произвели конфигурацию с поддержкой qt-mt331.dll), в одной директории. В командной строке теперь наберите эту директорию и попробуйте запустить программу.

Если программа запустилась без всяких проблем, мы получили успешно отлинкованную программу showimg. Если вы попытаетесь открыть PNG изображение, используя данную программу, картинка отобразиться корректно, но если вы захотите открыть JPEG картинку, ничего не произойдет, так как вы не подключили JPEG плагин к приложению.

[править] Плагины

Плагины работают несколько по-другому, нежели обычные DLL. Мы всего лишь копируем их в директорию с исполняемой программой, точно так, как мы делали с Qt DLL. Приложения Qt ищут плагины к программе в подкаталоге в пределах их собственной директории, например, плагин для изображений должен находиться в подкаталоге imageformats, SQL драйвер должен находиться в подкаталоге sqldrivers.

Таким образом, чтобы сделать JPEG плагин доступным для нашего приложения, нам требуется создать нужную директорию и скопировать туда требуемую DLL, например:

mkdir imageformats
copy %QTDIR%\plugins\imageformats\qjpeg100.dll imageformats

Если же вы не установили переменную окружения QTDIR, вы должны будете набирать абсолютный путь к вашей Qt директории, нежели использовать %QTDIR%.) Если теперь вы откроете JPEG изображение, то оно отобразится правильно.

Основное преимущество плагинов состоит в том, что они могут быть сделаны доступными целому семейству программ. Например, ели мы имеем несколько программ, которые нуждаются в поддержке JPEG модуля, рациональнее всего использовать общую директорию для наших плагинов. Конечно, мы могли бы положить все наши плагины в директорию "C:\QtPlugins"". Если мы используем текущую директорию, ты мы также должны использовать поддиректории для различных плагинов, таким образом наш плагин должен находиться в следующей поддиректории: ""C:\QtPlugins\imageformats"". Чтобы наши приложения знали об этой директории, мы должны добавить следующую строку перед тем, как программе потребуется загрузить данный плагин:

qApp->addLibraryPath("C:\\QtPlugins");

Чаще всего удобнее добавить данную строку в начале главной программы main(). Как только путь добавлен, программы будет использовать его для поиска плагинов, а также просматривать подкаталоги своей директории. Таким образом, некоторое количество путей будет добавлено.

[править] Динамические связи С

Иногда вам требуется поставлять свою программу с динамической библиотекой С. Большинство версий Windows будет уже иметь установленную динамическую библиотеку, но если вы используете современный Visual Studio, то это не приемлемо. Мы можете проверить с какими библиотеками связывается ваша программа, используя утилиту depends. Чтобы использовать утилиту depends, вам требуется выполнить следующее:

depends <application executable>

Таким образом, вам выведется список библиотек, используемых вашей программой. Если вы посмотрите в верхне - левую секцию, то увидите список библиотек.

[править] Завершение

Данная статья охватила ключевые аспекты распространения программы на Qt под систему Windows. В данном документе мы не упомянули о версиях Windows, так как в этом не было никакой потребности. Приложения, построенные на какой-то определенной версии Windows, будут работать так же и на других.


[1] Отметьте, что мы использовали make во всех примерах, но если вы используете Microsoft Visual C++, вы должны использовать nmake.