Приложение на qt не запускается на другом компьютере

Обновлено: 20.05.2024

Я просто хочу дать исполняемый файл и, возможно, позволить другому пользователю (также работающему с Ubuntu) загрузить библиотеку qt5 (не для разработчиков), чтобы запустить приложение.

Я не заинтересован в компиляции статической версии qt только для того, чтобы сделать этот исполняемый файл самодостаточным.

проверка с ldd Я продолжал получать конкретные библиотеки, которые кажутся необходимыми

говорит, что у меня уже установлены последние версии.

Тем не менее приложение не запускается. что случилось? какие библиотеки времени выполнения я должен получить, чтобы исполняемый файл нашел все символы?

2 ответа

Я считаю, что есть несколько методов, которые можно использовать. Я перечислил один метод ниже, и это рекомендуемый метод в документации по развертыванию, которую я дал в комментарии.

Я использую стандартный новый проект приложения Qt Widgets под названием HelloWorld для этого примера, и он был скомпилирован в режиме выпуска, а полученный файл называется "HelloWorld". В этом примере также предполагается, что вы используете x64.

Предполагая, что мы начинаем с корневой папки с именем MyApp, скопируйте в нее исполняемый файл "HelloWorld". Затем в эту папку необходимо скопировать следующие библиотеки из QtInstallationFolder/gcc_64/lib:

  • libicudata
  • libicui18n
  • libicuuc
  • libQt5Core
  • libQt5DBus
  • libQt5Gui
  • libQt5Widgets
  • libQt5XcbQpa

Также скопируйте следующую библиотеку из QtInstallationFolder/gcc_64/plugins/platform в MyApp/platform:

Скопируйте и вставьте следующее в текстовый редактор и сохраните его в папке MyApp как HelloWorld.sh:

После этого вы сможете запустить приложение из корневой папки приложения с помощью:

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

Как правило программы пишутся для того чтобы их впоследствии распространять. Либо в открытом доступе, либо локально (например, внутри компании).

Как сделать, чтобы пользователь мог работать с программой, написанной на Qt, на своём компьютере?

Подготовку программы на Qt к распространению можно условно разделить на два этапа:

Компиляция программы в «релиз»;

Комплектация программы необходимыми библиотеками.

Рассмотрим оба этапа применительно к Qt 5.7 с компилятором MinGW для операционной системы Windows.

Компиляция программы в «релиз»

Существуют два основных варианта компиляции приложения:

Отладочный вариант используется только на этапе разработки и не предназначен для распространения. Кроме того, при комплектации библиотеками для отладочного варианта последние должны иметь суффикс « d » в названии.

Поэтому программу перед распространением необходимо скомпилировать в варианте «Выпуск» («релиз»).

Выбрать нужный вариант компиляции можно непосредственно в рабочем окне QtCreator как показано на скриншоте.

Компиляция в релиз

После выбора варианта компиляции и её последующего запуска, программа будет скомпилирована соответствующим образом.

Комплектация библиотеками

После компиляции программы её следует обязательно укомплектовать необходимыми библиотеками.

Дело в том, что в папке со скомпилированной программой находится только исполняемый файл (exe). В таком виде программа будет работоспособна только при запуске из QtCreator, что для обычного пользователя совершенно не приемлемо (да и для самого разработчика не всегда удобно).

Конкретный перечень необходимых библиотек зависит от проекта. Ниже приведён список самых основных из них (которые требуются для запуска любого Qt приложения).

Библиотеки собственно Qt:

Их, а также другие библиотеки Qt можно найти в папке : папка_установки_Qt\Tools\mingw530_32\bin

Служебные библиотеки компилятора:

Их можно найти в папке: папка_установки_Qt\5.7\mingw53_32\bin

Для того чтобы укомплектовать своё приложение необходимыми библиотеками достаточно просто скопировать их в папку с исполняемым файлом.

После этого программа будет готова к распространению и можно приступать к созданию инсталлятора или просто упаковать приложение вместе со всеми библиотеками, например, в zip архив.

Обратите внимание!

Библиотеки для приложения следует копировать именно из папок mingw, а не QtCreator. В последнем случае программа будет укомплектована библиотеками, которые предназначены только для QtCreator и, как следствие, может в итоге оказаться неработоспособной.


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

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

В качестве среды для разработки используется Qt 5.2.0 for Windows 32-bit (MinGW 4.8). Для версий не с компилятором MinGW алгоритм решение проблемы может быть иным.

Проблема

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

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

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

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

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

Если мы перейдем в папку C:\Qt\build-Example-Desktop_Qt_5_2_0_MinGW_32bit-Debug (у вас папка может по-другому называться), то увидим следующее:

Папка с построенным проектом

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

Папка с EXE файлом приложения

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

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

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

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 :

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

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

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

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

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

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

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

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

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

Но если попробовать запустить EXE файл, то вылетит ошибка, так как три DLL не скопировались: libwinpthread-1.dll , libstdc++-6.dll , libgcc_s_seh-1.dll . Их нужно вручную скопировать из той же папки, где находится windeployqt.exe :

Папка с недостающими DLL

После этого приложение должно запуститься. Настоятельно рекомендую проверить работоспособность приложения на чистом компьютере без установленной Qt.

Для компилятора Visual Studio алгоритм тот же, но лучше еще добавить параметр --compiler-runtime , например:

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

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

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

Начало решения проблемы

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

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

Режим Debug

Переключение в режим Release

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

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

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

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

Заходим в эту папку (у меня это C:\Qt\build-Example-Desktop_Qt_5_2_0_MinGW_32bit-Release ):

Папка release

Если в прошлый раз мы заходили в папку debug , то сейчас заходим в папку release , и запускаем приложение:

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

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

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

Итак, приложение ругается на отсутствие Qt5Core.dll (у вас может быть цифра другая, если в момент чтения статьи вышла иная версия Qt). Где этот файл искать?

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

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

Папка Qt

В ней будет папка компилятора MinGW:

Папка MinGW

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

Содержимое папки MinGW

В ней находим главную папку bin :

Папка bin

И в этой папке находим нужные нам dll . Находим тут Qt5Core.dll (не Qt5Cored.dll . ) и копируем в папку C:\Qt\build-Example-Desktop_Qt_5_2_0_MinGW_32bit-Release\release (где наш *.exe файл находится). И запустим приложение:

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

И вот так копируем все нужные DLL, которые просит приложение. У меня потребовались следующие DLL: icudt51.dll , icuin51.dll , icuuc51.dll , libgcc_s_dw2-1.dll , libstdc++-6.dll , libwinpthread-1.dll , Qt5Core.dll , Qt5Gui.dll , Qt5Widgets.dll . И вот приложение запустилось:

Приложение запустилось

Ура! Но рано радоваться. Если мы запустим на компе, где нет Qt, то приложение выдаст ошибку, так как не может найти библиотеки. Надо скопировать еще несколько файлов. Помните основную папку Qt? Переходим в неё:

Папка Qt

Там есть папка Tools :

Папка Tools

В ней есть папка QtCreator :

Папка QtCreator

В ней папка bin :

Папка bin

Скопируйте файл qt.conf в папку с *.exe файлом:

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

Теперь перейдите в папку с компилятором:

Папка MinGW

А там перейдем в папку plugins , а оттуда в platforms :

Папка plugins

Папка platforms

Скопируйте файлы qminimal.dll и qwindows.dll . Но вставим не просто в папку с *.exe файлом, там создадим папку plugins , а там папку platforms , и уже в нее вставим файлы. То есть для всех DLL, которые нам могут пригодиться, некоторые находятся не прямо в папке bin , то для этих DLL в папке с EXE файлом мы должны создать такие же папки, в которых они находились, относительно папки компилятора. В нашем случае в папке с компилятором файлы находись под именами: [путь к папке с компилятором] \plugins \platforms \qminimal.dll , [путь к папке с компилятором] \plugins \platforms \qwindows.dll . Поэтому копируйте так: [путь к папке с *.exe файлом] \plugins \platforms \qminimal.dll , [путь к папке с *.exe файлом] \plugins \platforms \qwindows.dll .

Вот теперь приложение запустится везде! То есть вы должны вместе с EXE файлом копировать все эти DLL и qt.conf . На скриншоте временные файлы я не удалил:

Итоговая папка со всеми дополнительными файлами

Здесь показан принцип, как находить нужные DLL. Если вы используете какие то другие компоненты, например, QWebVie w, то вам будут нужны еще другие DLL, которые вы находите аналогичным способом.

Помните, что если вы используется QtQuick то вам еще потребуется папка qml .

Внимание! Иногда описанный выше способ не помогает. Вроде скопировали все DLL, что вам могли пригодиться, приложение даже запускается, но вы видите лишь белый экран, например, или приложение вообще не появляется, но в диспетчере задач появляется.

В таком случае копируйте все DLL из папки bin (а из остальных мест в виде папок, где они хранятся) и начинайте скрупулезно удалять поштучно DLL до тех пор, пока не сузите число файлов до минимально работающего числа. Помните, что все DLL есть в двух вариантах: для release и ли debug режима. Для debug режима в имени DLL появляется буква d . Эти файлы вам не нужны!

Статья обновлена 2018

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

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

введите описание изображения здесь

Я разработал простое приложение с Qt 5.0.2 для Windows 7 Ultimate. В качестве компилятора QtCreator использовал MSVC2012_64bit. И я не могу перенести свое приложение на другой компьютер. Это не работает. Приложение Qt требует DLL, которые я не могу найти. Исследователь зависимостей считает, что .dll s ниже не найдены. Где я могу их найти? Почему эта проблема так широко распространена? Все люди жалуются, что они не могут получить их .exe , который разработан с Qt, работает на другом компьютере.

EDIT1: Кстати, когда я добавил DCOMP.dll скачал из интернета, не найденные dll стали в 2-3 раза больше чем сейчас 🙂

EDIT2: Также обратите внимание, что на другом компьютере (Windows 7 Home Premium), когда я дважды щелкаю по exe-файлу, он показывает, что он загружается и не оказывает никакого влияния, ничего не ошибается вообще.

Решение

Этот список DLL мне нужно, а также я скопировал C:\Qt\Qt5.0.2\5.0.2\mingw47_32\plugins\platforms папка:

введите описание изображения здесь

Только это и у меня сработало. Кстати, я использую Windows 7 Ultimate 64x и Qt 5.0.2 для 32-битного пакета Windows (MinGW 4.7, 650 МБ) для Qt.

РЕДАКТИРОВАТЬ: Вам также может понадобиться .dll QtCreator для копирования, а также вам может понадобиться файл с именем qt.conf со следующим содержанием (скопировано из ответа @Renato):

Другие решения

просто добавьте файл qt.conf в каталог вашего приложения со следующим содержанием

затем скопируйте в каталог dir приложения «платформы», который вы найдете в каталоге dir C: \ Qt \ Qt5.1.1 \ Tools \ QtCreator \ bin

Это решается, потому что qtcore.dll компилируется с внутренними путями вашей установки qt. (Я не знаю, вай!). Поскольку qt.conf всегда читается qtcore, когда приложение запускает библиотеки на «платформах», они будут включены, и приложение будет работать на любом хосте.

Предупреждение: подкаталог qtcore и платформы должен быть из одной и той же установки qt.

Извините по английски но решение работает отлично.

Это с каталогом Qt \ bin в моем $ PATH (или, я думаю, на языке Windows,% PATH%;)) с использованием Qt 5.5, хотя я сделал то же самое с 5.2 и 5.3.

IIRC, если я использую MSVC в качестве компилятора, мне все равно нужно было скопировать эти библиотеки DLL (в моем случае, msvc2010, поэтому msvcp100.dll и msvcr100.dll) вручную, но я мог ошибиться.

Читайте также: