Запуск Qt приложений под Visual Studio .exe вне Qt Creator

Featured image

В статье рассказывается как запускать приложения, созданные в Qt под Visual Studio без самого Qt Creator. Или же приложения должны запускаться на компах, где нет Qt.

📖 Содержание ⬇️

Содержание

Для версии Qt под компилятор MinGW читайте статью Запуск Qt приложений .exe вне Qt Creator | ↗️.

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

В качестве среды для разработки используется Qt 5.6.0 for Visual Studio 2015.

Проблема

Допустим, мы создали простое приложение Qt Widgets.

При запуске приложения в самом Qt Creator (при нажатии на зеленую стрелку, или же через меню, или же иным способом) мы видим наше приложение:

Запущенное приложение

Рисунок 1 — Запущенное приложение

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

Выбор компилятора для приложения

Рисунок 2 — Выбор компилятора для приложения

Указанные тут папки и есть папки, куда сохраняется наше приложение.

Если мы перейдем в папку C:\Harrix\Projects\QtProjects\untitled10\_build (у вас папка будет называться по-другому, так как я изменял путь в настройках программы), то увидим следующее:

Папка скомпилированного приложения

Рисунок 3 — Папка скомпилированного приложения

Зайдем в папку debug и найдем там наше приложение:

Папка с EXE файлом

Рисунок 4 — Папка с EXE файлом

Если мы его запустим, то получим ошибку:

Ошибка при запуске приложения

Рисунок 5 — Ошибка при запуске приложения

Как быть?

Первый способ — Официальная утилита windeployqt

У Qt есть утилита windeployqt, которая поставляется с Qt и про которую можно прочитать тут http://doc.qt.io/qt-5/windows-deployment.html. Она решает ту же задачу, что и второй способ ниже.

Update 2018. Сейчас библиотека стала работать гораздо лучше. Поэтому ниже будет более подробная инструкция по использованию windeployqt.

Итак, в командной строке перейдите в папку bin того компилятора, под которым вы компилируете приложение в режиме Release. В этой папке должен быть файл windeployqt.exe. Например, у меня в данный момент для MinGW это папка D:\Qt\5.12.0\mingw73_64\bin, а для Visual Studio D:\Qt\5.12.0\msvc2017_64\bin.

Перейти можно с помощью команды cd:

Командная строка в нужной папке

Рисунок 6 — Командная строка в нужной папке

Скомпилируйте в режиме Release ваше приложение. Для примера я создал простое Qt Widgets Application и скомпилировал под Visual Studio компилятором:

Компилирование в режиме Release

Рисунок 7 — Компилирование в режиме Release

Найдите папку, в которой находится скомпилированный EXE файл. Например, в моем случае это папка D:\Harrix\Projects\Qt\untitled\_build\release:

Папка с EXE файлом

Рисунок 8 — Папка с EXE файлом

Теперь можно в командной строке вызвать windeployqt с указанием папки с EXE файлом:

windeployqt D:\Harrix\Projects\Qt\untitled\_build\release --compiler-runtime

Вызов команды windeployqt

Рисунок 9 — Вызов команды windeployqt

Теперь в папке добавились нужные файлы:

Папка с EXE файлом и DLL

Рисунок 10 — Папка с EXE файлом и DLL

Если у вас приложение с использованием QML, то нужен параметр --qmldir с указанием папки, где хранятся .qml файлы:

windeployqt --compiler-runtime --qmldir D:\Harrix\Projects\Qt\untitled D:\Harrix\Projects\Qt\untitled\_build\release

Стоит обратить внимание на то, что windeployqt может копировать лишние файлы. От них можно избавиться, потихоньку удаляя файлы из папки на чистом компьютере.

Второй способ — Ручной

Решение проблемы

Мы же хотим, чтобы приложение запускалось на других компах? Поэтому надо в «окончательном» виде выдавать приложение, а не в режиме отладки.

Внизу, над зеленым треугольником выбираем режим Release:

Выбор режима компилирования Release

Рисунок 11 — Выбор режима компилирования Release

Запускаем приложение, нажатием на зеленый треугольник слева внизу Qt Creator.

Как видим, через некоторое время запустилось привычное нам приложение. Но теперь *.exe файл появился в папке, которое мы указывали для Release.

Заходим в эту папку (если в прошлый раз мы заходили в папку debug, то сейчас заходим в папку release). У меня это C:\Harrix\Projects\QtProjects\untitled10\_build\release:

Папка release с EXE файлом

Рисунок 12 — Папка release с EXE файлом

Кстати, для последующего распространения программы нам из папки нужен (из текущих файлов) только *.exe файл, поэтому файлы main.obj, mainwindow.obj, moc_mainwindow.cpp, moc_mainwindow.obj можно удалить без ущерба (это служебные файлы, которые при каждой компиляции будут появляться).

Нахождение DLL и других файлов

Итак, приложение ругается на отсутствие библиотек. Где их искать?

Найдите папку, в которую устанавливался Qt. У меня это папка C:\Qt\Qt5.6.0

В ней найдите папку с номером версии вашего Qt. У меня это первая папка с названием 5.6. У вас скорее всего будет немного по-другому называться:

Папка Qt

Рисунок 13 — Папка Qt

В ней будет папка компилятора Visual Studio (соответственно битности вашей версии Qt):

Папка для компилятора Visual Studio

Рисунок 14 — Папка для компилятора Visual Studio

Переходим в неё:

Содержимое папки для компилятора Visual Studio

Рисунок 15 — Содержимое папки для компилятора Visual Studio

Вначале нам понабиться папка plugins.

Оттуда копируем в папку с EXE файлом папку platforms:

Папка platforms

Рисунок 16 — Папка platforms

Из неё удаляем все файлы, кроме DLL и те DLL, название которых заканчивается на d. Это варианты библиотек для режима Debug:

Файлы DLL из папки platforms

Рисунок 17 — Файлы DLL из папки platforms

Скопированные файлы DLL в папку platforms

Рисунок 18 — Скопированные файлы DLL в папку platforms

Аналогично вам потом могут понабиться файлы других подключаемых библиотек, которые вы можете использовать. Для обычного приложения вам будет нужна из папки plugins всего лишь папка библиотек для работы с Windows, которую мы только что скопировали.

Теперь переходим в папку с компилятором, где мы уже были. У меня это C:\Qt\Qt5.6.0\5.6\msvc2015_64. В ней находим главную папку bin:

Папка bin

Рисунок 19 — Папка bin

Копируем оттуда все DLL, название которых не заканчивается на d, в папку с EXE файлом.

Кстати, вам может понабиться файл qt.conf, а может и нет.

Если приложение не запускается при этих файлах, то еще не скопировали DLL (например, из папки plugins). Если при этом запустится ваше приложение, то все библиотеки есть, но большинство — лишние.

После этого вас ждет «увлекательный» процесс по поочередному удалению DLL и запуску приложения. Оставьте только те, без которых программа не запустится. У меня для простейшего приложения потребовались лишь эти файлы:

Библиотеки для запуска приложения

Рисунок 20 — Библиотеки для запуска приложения

Это еще не конец

Если у вас был бы Qt под MinGW, то на этом история закончилась, когда вы нашли все DLL и возможно добавили qt.conf. Но вы же работаете с Visual Studio.

Запустите приложение на чистой операционной системе (желательно Windows 7 или 8.1, а не Windows 10). И у вас программа скорее всего не запустится ввиду отсутствия некоторых DLL.

Например, я работал с Qt под Visual Studio 2015, и у меня потребовали библиотеку VCRUNTIME140.dll. В общем, вам нужны в операционной системе файлы под Visual Studio 2015 (или какой версии вы пользуйтесь).

Пакеты Visual C++ Redistributable для разных версий Visual Studio: https://support.microsoft.com/ru-ru/help/2977003/the-latest-supported-visual-c-downloads.

Например, для Visual Studio 2015 вам нужно установить пакет https://www.microsoft.com/en-us/download/confirmation.aspx?id=48145:

Visual C++ Redistributable for Visual Studio 2015

Рисунок 21 — Visual C++ Redistributable for Visual Studio 2015

То есть вам нужно будет выбрать один из нескольких вариантов:

  • обязать пользователя установить самому данный пакет (или установить всю Visual Studio) в инструкции по установке программы;
  • поставлять файлы пакета со своей программой (ничего не могу сказать про лицензирование);
  • встроить нужные файлы в установщик вашей программы (в этой статье не обсуждается).