Как перенести qt программу на другой компьютер
Расскажу, как запустить программу, написанную на C++/Qt для windows, на другом компьютере, где библиотеки Qt 5 не установлены. Вот мы, допустим, установили Qt Creator, создали приложение из одного окна с надписью «Hello World», выбрали для сборки конфигурацию «Выпуск» и нажали заветный зелёный треугольник. Через несколько секунд успешно запустится наша программа. Находим, где же программа лежит. Путь к ней будет примерно такой: D:\…Projects\2013-09-30_HelloWorld\build-HelloWorld-Desktop_Qt_5_2_0_MinGW_32bit-Выпуск\release\HelloWorld.exe. Радоваться рано. Если мы закроем Qt Creator, отправимся по этому пути и попытаемся запустить HelloWorld.exe,то получим следующую ошибку: «Запуск программы не возможен, так как на компьютере отсутствует Qt5Core.dll. Попробуйте переустановить программу.» Точно такая же ошибка возникнет на любом другом компьютере, где мы попытаемся запустить эту программу. Варианты решения:
1. Пересобрать сам Qt, чтобы собранные приложения статически линковались с библиотеками Qt 5 — долго, сложно, программа будет тяжёлая, и заморочки с лицензированием
2. Устанавливать на все компьютеры, где будем использовать программу, библиотеки Qt 5, совместимые с нашей сборкой, и прописывать путь к ним в системной переменной PATH
3. Сложить все необходимые DLL-библиотеки в одну папку с экзешником нашей программы. Получится по сути Portable-версия, которую можно будет хоть с флэшки запускать. Этот способ самый простой, им и воспользуемся.
1. Копируем программу в отдельную папку
2. Запускаем, смотрим имя файла в тексте ошибки
3. Находим этот DLL-файл в папке C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin и копируем его рядом с экзешником
4. Возвращаемся к пункту 2 и повторяем до тех пор, пока программа не запустится.
Итого у меня по минимуму получился следующий список DLL-библиотек для Qt 5.2:
- icudt51.dll
- icuin51.dll
- icuuc51.dll
- libgcc_s_dw2-1.dll
- libstdc++-6.dll
- libwinpthread-1.dll
- Qt5Core.dll
- Qt5Gui.dll
- Qt5Widgets.dll
- HelloWorld.exe
Всего размер папки получился 42 Мб, вроде как бы многовато для простого Hello World. Кого это не смущает — уже могут делиться своей программой. А я расскажу теперь, как сократить этот объём хотя бы до 16 Мб, не сильно сложно (для сравнения библиотеки Qt4 от известной программы для хранения паролей KeePassX весят 10 Мб). Библиотеки и программу мы будем просто сжимать бесплатным свободным упаковщиком UPX. Порядок действий:
-
— версию для windows
- Распаковываем скаченный архив
- Возвращаемся к нашим DLL-файлам, щёлкаем по каждому правой кнопкой, выбираем «Открыть с помощью» — upx.exe
Вот теперь папка с нашей программой весит 16 Мб, и её содержимое можно спокойно запускать на других компьютерах.
Запись опубликована 2014-05-01 автором admin в рубрике Без рубрики с метками dll, exe, qt, UPX, windows.
Об авторе admin
Инженер-программист, системный администратор
Qt 5: подготовка программы для windows к запуску на других компьютерах : 2 комментария
Отличная статья. Не могли бы вы пожалуйста написать нечто подобное для маководов и линуксоидов? Заранее спасибо.
У меня на моем ПК, все запускается без ошибок. В папку с .exe я положил все нужные библиотеки. Но на другом ПК пишет, что Qt плагин не найден.
Подскажите пожалуйста, что делать?
3 ответа 3
- собрать релиз
- использовать программу windeployqt Ее нужно запустить из папки, где лежит .exe вашей программы.
У меня не запускается windeployqt. Тоесть запускается, но только на мгновенье, а потом сразу же закрывается
А теперь пришло время прочитать пост на Хабре(на который я ссылаюсь). Эта программа - утилита с интерфейсом командной строки. Ее и запускать надо из командной строки.
А если сделать без специализированного ПО, то можно так:
Во-первых вот тут есть великолепная инструкция, которой всегда пользуюсь.
Во-вторых, если своими словами, как-то так:
- В версии сборки ставите Release
- Собираете приложение
- Копируете Ваш .exe -файл в другое расположение
- Запускаете
- Вылазит ошибка о том, что не хватает определённой .dll -библиотеки
- Ищете нужную виндовым поиском по файлам и подставляете в ту папку, куда Вы скопировали .exe
- Если вылазит ошибка не связанная с наличием какой-либо библиотеки, копируете все библиотеки из папки с библиотеками Qt (название начинается с Q и расширение .dll ) в папку с Вашим проектом, а потом удаляете лишние. Долго, но действенно
- Когда Ваше приложение, наконец, запустилось и все лишние библиотеки удалены, то, что осталось копируете на любой другой комп без Qt и запускаете.
для мака точно был macdeployqt, может и для linux есть, но не смотрел. А вот c windeployqt у меня так до конца и не получилось подружиться, он мне не добавлял qml-библиотеки. В целом было ощущение (каюсь, подробно не копал) что он подцепил только то что безусловно линкуется на старте приложения и без чего оно даже не встает, а всякие qml-компоненты линкуются уже потом и как плагины, так что приложение успешно запускается, но дальше их не находит и завершается с ошибкой
@V-Mor Для Unix-подобных не надо "таскать с собой" Qt. При сборке пакета, указываются зависимости от нужных компонентов, а штатный пакетный менеджер их поставит. Или удостоверится, что они уже есть в системе.
Добрый день. Скомпилировал программу в qt creator с использованием либ opencv.
Скопировал на другой компьютер папку релиза, выдает ошибку в отстувии библиотек, скопировал в эту папку необходимые либы, всё равно ошибка, скопировал в /usr/local/lib та же хрень.
Так же делал sudo ldconfig - v.
Привык что в винде при переносе можно все dll просто в папку с exe закинуть и всё работает, а здесь какая-то засада.
Не буду же я компилить opencv на каждой машине где прогу запустят?
- Вопрос задан более трёх лет назад
- 1603 просмотра
Простой 3 комментария
Что было в винде, то осталось в винде. В линухе другой подход. Здесь не будут автоматом грузиться левые либы.
1. Проверьте, что в /etc/ld.so.conf.d есть файлик (имя любое), содержащий строку:
/usr/local/lib
Если не было, создайте и уже потом ldconfig. Проверить, что нужные либы система увидела, можно через ldconfig -p
2. Если используется opencv, то на целевой машине должен стоять OpenCV - а Вы думаете, менеджеры пакетов, которые автоматически разрешают и ставят зависимости - просто так придумали, от скуки?
3. Вы еще и автоматически детектить его должны через configure и ошибку выдавать вменяемую, что OpenCV не обнаружен - это если программа будет только в сырцах распространяться. А если пакетами - то ее поставит соответствующий пакетный менеджер, для чего ему должны быть конечно выданы указания :)
. Что было в винде, то осталось в винде. В линухе другой подход. Здесь не будут автоматом грузиться левые либы.
planc, Это проблемы ребят :) Не, может быть в бубунте что-то особенное сделано, я просто не работал в ней никогда. Но приходилось неоднократно таскать наработки между центосами и FreeBSD (не между ними конечно же, а между несколькими центосами и несколькими FreeBSD). Так вот там оказалось проще освоить местные пакетные менеджеры и паковать наработки в пакеты, при установке которых yum или pkg_add сам поставит депенды.
- Подготовка проекта Qt к развёртыванию
- Компоновка дистрибутива программы
- Подписание кода и создание установщика
1. Подготовка проекта Qt к развёртыванию
Для того, чтобы было проще следовать инструкциям, создадим простой проект Qt Widgets. Все последующие операции будут относиться к этому проекту. Ниже приведено содержимое исходных файлов приложения:
Программы выглядят особенно качественно и профессионально, если они несут с собой метаданные о разработчике, версии программного продукта, авторских правах, языке и многом другом. Для примера, обратимся к свойствам файла Photoshop.exe всем известной системы Adobe Photoshop. На рисунке ниже показано окно свойств данного файла:
Добавить подобную информацию можно с помощью файла ресурсов. Файл ресурсов имеет расширение .rc и несёт в себе текстовый код, описывающий используемые в приложении ресурсы. Подобные скрипты используются в проектах Visual Studio, основанных на WinAPI, и содержат различные дескрипторы иконок, строк, идентификаторов и прочего. В проектах Qt всё это имеет мало смысла, однако включение общей информации о программе всё же необходимо. Ниже приведены исходный код файла ресурсов и содержимое файла проекта, который также потребуется изменить:
В данном примере важно не забыть добавить файлы resources.rc и icon.ico в папку с исходными файлами проекта. На рисунке ниже показано окно свойств программы после сборки:
Иногда бывает необходимо, чтобы программа запускалась с правами администратора. В рамках Qt это можно реализовать путём использования несложных инструкций в файле проекта. Ниже приведён код, позволяющий программе запрашивать права администратора при запуске:
Следует отметить, что все указанные выше инструкции будут гарантированно работать только при использовании комплекта сборки Visual Studio. Подробную информацию о файлах ресурсов можно найти на портале MSDN в разделе «About Resource Files».
2. Компоновка дистрибутива программы
Создание дистрибутива приложения с учётом всех его файлов, которые должны устанавливаться на компьютерах пользователей, вероятно, является самым сложным этапом развёртывания. Требуется тщательно проанализировать исполняемый файл программы на наличие зависимостей, позаботиться о файлах переводов, не забыть про ресурсы приложения. Решить часть этих проблем поможет утилита windeployqt.exe, которая поставляется вместе с комплектом сборки. Данный инструмент работает в командной строке и поддерживает некоторые параметры конфигурации. На рисунке ниже показано окно командной строки с запущенной утилитой:
Последним параметром обязательно должен быть указан путь к двоичным файлам собранного приложения или имена этих файлов. В таблице ниже перечислены параметры утилиты, которые можно использовать при работе с ней:
Параметр | Описание |
-?, -h, --help | Вывод справки |
-v, --version | Вывод информации о версии |
--dir каталог> | Использовать указанный каталог вместо каталога файлов |
--libdir путь> | Каталог, в который будут скопированы библиотеки |
--debug | Использовать отладочные версии файлов |
--release | Использовать файлы для выпуска |
--release-with-debug-info | Использовать файлы для выпуска с отладочной информацией |
--force | Заменить уже существующие файлы |
--dry-run | Провести работу с целью проверки |
--no-plugins | Пропустить копирование плагинов |
--no-libraries | Пропустить копирование библиотек |
--qmldir каталог> | Сканировать импорт QML, начиная с указанного каталога |
--no-quick-import | Пропустить Qt Quick |
--no-translations | Пропустить копирование файлов перевода |
--no-system-d3d-compiler | Пропустить копирование компилятора Direct3D |
--compiler-runtime | Копировать зависимости компилятора |
--no-compiler-runtime | Пропустить зависимости компилятора |
--webkit2 | Копировать файлы WebKit2 |
--no-webkit2 | Пропустить WebKit2 |
--json | Печатать вывод в формате JSON |
--angle | Копировать файлы ANGLE |
--no-angle | Пропустить ANGLE |
--list режим> | Печатать только имена копируемых файлов. Режимы: source, target, relative, mapping |
--verbose уровень> | Уровень отладки |
-имя библиотеки> | Добавить указанную библиотеку |
--no-имя библиотеки> | Не добавлять указанную библиотеку |
После запуска утилиты возле исполняемого файла программы должны появиться различные библиотеки и служебные файлы, которые позволят приложению корректно запускаться и работать на многих компьютерах. На рисунке ниже показано окно Проводника Windows со структурой дистрибутива:
Следует отметить, что перед использованием windeployqt.exe необходимо добавить путь к этому файлу в переменную среды PATH, в противном случае данный инструмент работать не будет.
3. Подписание кода и создание установщика
После проделанной работы пришло время задуматься над выбором системы создания установщика для подготовленного приложения. Существуют как платные, так и бесплатные продукты для выполнения данной задачи. В таблице ниже перечислены некоторые инструменты для создания программ установки:
Платные | Бесплатные |
InstallShield | Qt Installer Framework |
Setup Factory | NSIS |
SetupBuilder | Inno Setup |
Smart Install Maker | WiX |
Сложно дать какие-либо рекомендации по поводу выбора той или иной системы. Разработчики ПО с открытым исходным кодом, вероятно, выберут бесплатные инструменты, в то же время платные продукты часто используются коммерческими компаниями.
Заключение
В заключение нужно сказать, что к подготовке приложений к выпуску следует подходить с большой ответственностью. Перед использованием программы пользователь проходит этап установки продукта на компьютер. Информация, которую он при этом получает, должна произвести благоприятное впечатление.
В статье рассказывается как запускать приложения, созданные в 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 и найдем там наше приложение:
Если мы его запустим, то получим ошибку:
Первый способ — Официальная утилита 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 компилятором:
Найдите папку, в которой находится скомпилированный EXE файл. Например, в моем случае это папка D:\Harrix\Projects\Qt\untitled\_build\release :
Теперь можно в командной строке вызвать windeployqt с указанием папки с EXE файлом:
Теперь в папке добавились нужные файлы:
Но если попробовать запустить EXE файл, то вылетит ошибка, так как три DLL не скопировались: libwinpthread-1.dll , libstdc++-6.dll , libgcc_s_seh-1.dll . Их нужно вручную скопировать из той же папки, где находится windeployqt.exe :
После этого приложение должно запуститься. Настоятельно рекомендую проверить работоспособность приложения на чистом компьютере без установленной Qt.
Для компилятора Visual Studio алгоритм тот же, но лучше еще добавить параметр --compiler-runtime , например:
Если у вас приложение с использованием QML, то нужен параметр --qmldir с указанием папки, где хранятся .qml файлы:
Стоит обратить внимание на то, что windeployqt может копировать лишние файлы. От них можно избавиться, потихоньку удаляя файлы из папки на чистом компьютере.
Второй способ — Ручной
Начало решения проблемы
Мы же хотим, чтобы приложение запускалось на других компах? Поэтому надо в окончательном виде выдавать приложение, а не в режиме отладки.
Внизу, над зеленым треугольником выбираем режим Release :
Запускаем приложение, нажатием на зеленый треугольник:
Как видим, через некоторое время запустилось привычное нам приложение. Но теперь *.exe файл появился в папке, которое мы указывали для Release :
Заходим в эту папку (у меня это C:\Qt\build-Example-Desktop_Qt_5_2_0_MinGW_32bit-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 версия стоит):
В ней будет папка компилятора MinGW:
Переходим в неё:
В ней находим главную папку 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? Переходим в неё:
Там есть папка Tools :
В ней есть папка QtCreator :
В ней папка bin :
Скопируйте файл qt.conf в папку с *.exe файлом:
Теперь перейдите в папку с компилятором:
А там перейдем в папку 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.
Harrix
Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.
Читайте также: