Windows и динамические библиотеки (QtCore4.dll,msvcr100.dll. )
Такие файлы как например QtCore4.dll, QtNetwork4.dll являются неотъемлемой частью вашей программы , если вы не собираете проект статически.
При запуске Qt Creator добавляет путь к этим файлам в глобальную переменную PATH (в Windows). И если вы запускаете свою прогу из Qt Creator , то Qt Creator передает вашей проге свою среду исполнения (и там конечно есть PATH).
Но если вы запускаете свою программу (свой exe) уже самостоятельно (возможно уже на другом ПК), то как ваша программа найдет нужные ей QtCore4.dll, QtNetwork4.dll на другом ПК. Их там скорее всего вообще нет, или еще хуже другой ниже стоящей версии.
Короче надо тащить со своим exe-шником эти файлы.
Переходим к практике: добавляем по инструкции в файл pro нужные директивы.
win32 < libstocopy.files = $$QMAKE_LIBDIR_QTQTCORE4.DLL $$QMAKE_LIBDIR_QTQtNetwork4.DLL >win32 < CONFIG(debug, debug|release): OUTDIR = debug else: OUTDIR = release > libstocopy.path = $$OUT_PWD/$$OUTDIR INSTALLS = libstocopy
Жмякаем Запустить qmake

Очищаем все, пересобираем проект , но файлы QtNetwork4.dll и QtCore4.dll не появляются «хоть убей» в выходном каталоге release.
Консоль сборки показывает , что якобы все нормально:

И тут помогает такая логика — Запустить qmake : что он делает? — подготавливает файлы makefile, Makefile.Release , Makefile.Debug.

А если посмотреть Makefile.Release (на предмет где там появляется libstocopy) , то действительно там есть такая часть кода:
####### Install install_libstocopy: first FORCE @$(CHK_DIR_EXISTS) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f elease $(MKDIR) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f elease -$(INSTALL_FILE) c:QtSDK1.2.1DesktopQt4.8.1msvc2010libQTCORE4.DLL c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f elease -$(INSTALL_FILE) c:QtSDK1.2.1DesktopQt4.8.1msvc2010libQtNetwork4.DLL c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f elease uninstall_libstocopy: FORCE -$(DEL_FILE) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f eleaseQTCORE4.DLL -$(DEL_FILE) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f eleaseQtNetwork4.DLL -$(DEL_DIR) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f elease install: install_libstocopy FORCE uninstall: uninstall_libstocopy FORCE
так вот надо еще явно указать выполнение этапа install в следующем месте :

И вуаля — QtNetwork4.dll и QtCore4.dll появляются в каталоге release.

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

Файл msvcp100.dll находится у нас в каталоге C:Program Files (x86)Microsoft Visual Studio 10.0VC redistx86Microsoft.VC100.CRT.
Понятно , компилируем мы чем? — компилятором MSVC2010 ,и теперь вам надо в каталог к своей программе кинуть еще msvcp100.dll. Хорошо , что еще сам компилятор не надо с собой тащить.
Также нужен будет msvcr100.dll из того же каталога C:Program Files (x86)Microsoft Visual Studio 10.0VC edistx86Microsoft.VC100.CRT.
И вот теперь ваша программа на чужом девственном ПК запуститься. Ура Товарищи!
Не уверен , но может еще потребоваться добавить в самое начало вашего кода такое :
QStringList paths = QCoreApplication::libraryPaths(); //paths.append("."); paths.append(QCoreApplication::applicationDirPath()); QCoreApplication::setLibraryPaths(paths); // Когда ваша программа запускается, то она добавляет к своей среде исполнения в переменную PATH каталог, в котором она сама находится.
Еще как вариант , чтобы не заморачиваться с msvcr100.dll и msvcp100.dll можно кинуть в каталог программы vcredist_x86.exe (Распространяемый пакет Microsoft Visual C 2010 (x86)), скачанный с сайта MicroSoft.
Dll файли и их размещения
Здравствуйте, у меня есть проект на c++ qt. Когда я делаю релиз и запускаю exe-шник выскакивает ошибка, которая требует dll с qt. Я перемещаю нужные dll в папку с программой. В результате, куча файлов в одной папке. Могу ли я и КАК организовать иерархию файлов типа:
-папка с программой --сам exe-шник --папка с dll ---файлы dll
Отслеживать
задан 10 апр 2014 в 9:16
124 2 2 серебряных знака 10 10 бронзовых знаков
да, если папка с dll будет в PATH.
10 апр 2014 в 9:26
@KoVadim, а если я не хочу прописывать в Path? например, портативное приложения.
10 апр 2014 в 10:25
создайте себе батник, который поправит PATH и запустит программу. На другие программы это не повлияет.
10 апр 2014 в 11:17
@KoVadim, но теоретически и в начале программы до вызова qt методов, я могу добавить в Path
10 апр 2014 в 12:27
Если dll подключаются динамически, то можно использовать относительные пути. При статическом подключении в QtCreator не знаю как будет работать. А кутэшные библиотеки можно включить в exe если что.
10 апр 2014 в 12:41
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- qt
- c++
- dll
Какие dll файлы нужны в релизе qt
БлогNot. Qt: как запускать виджет без запроса библиотек dll
Qt: как запускать виджет без запроса библиотек dll
В последних сборках Qt появилось встроенное решение и уже не нужно искать сторонних.
Полноценной статической линковки с «упаковкой» библиотек «внутрь» exe’шки вы не получите, но сможете собрать все ресурсы приложения в одной папке, которую можно затем, например, упаковать в саморазворачивающийся или обычный архив и распространять как отдельное приложение.
Предполагаем, что у нас Qt Creator под Windows, хотя в целом подход годится и для других операционок. Вот алгоритм действий, проверенный мной для небольшого виджета с графическим интерфейсом.
Делаем работающую программу в конфигурации по умолчанию (debug). Заметим, что многие предупреждения, с которыми виджет нормально работает в дебаге (вроде неинициализированных переменных) в релизе приводят к тому, что программа отказывается запускаться, так что пишите код аккуратно и старайтесь избавиться не только от ошибок, но и от предупреждений компилятора.
Выбираем в левой панели Qt Creator над кнопкой запуска конфигурацию «Выпуск» (Release), пересобираем проект.
Идём в папку, где сохранен релиз проекта (в Qt Creator можно нажать правой кнопкой мыши на файле проекта и выбрать «Показать в проводнике»).
Уровнем выше находим папку с именем вида build-ИмяВиджета-Desktop_Qt_5_14_2_MinGW_64_bit-Release и внутри ещё папку release.
Исполняемый файл с расширением .exe, например, mywidget.exe, копируем в отдельную папку, например, d:\widget
Идём в папку с основными исполняемыми файлами Qt, например, c:\Qt\5.14.2\mingw73_64\bin
Копируем файл windeployqt.exe в папку widget, куда скопировали релиз проекта.
Убеждаемся, что путь к папке bin вашего Qt (такой, как написан выше) добавлен в переменные среды, если нет — добавляем.
Чтобы проверить это, идём Панель управления, Система, Переменные среды, можно просто кликнуть по «Пуск» и набрать соответствующий запрос.
Добавить нужно в системную переменную Path.
Открываем консоль (например, в Windows комбинация клавиш Win + R, выполнить команду cmd) или удобный файл-менеджер с командной строкой, переходим в папку widget командами
d: cd \widget
(или переходим в папку виджета средствами файл-менеджера).
Можно проверить, работает ли деплой:
windeployqt -h
Наконец, деплоим проект:
windeployqt mywidget.exe
Пробуем запустить исполняемый файл. Работает. Думаете, всё? Как бы ни так. Возможно, часть либ всё равно берётся из папки Qt.
На момент написания заметки, некоторые библиотеки Qt не деплоит. Грешит он этим, например, с libstdc++-6.dll, libgcc_s_seh-1.dll, libwinpthread-1.dll.
Простой способ проверить таков — закрываем среду, из «Проводника» переименовываем папку Qt, например, в Qt1 (потом не забываем вернуть прежнее имя!)
Если просит какие-то dll — ищем их в папке bin с Qt, докидываем в папку widget и повторяем запуск.
Ну или ищем в инете, в таком случае следите, чтобы библиотека была именно для вашей платформы (х86 или х64)
Если при запуске виджет просто вылетает с неизвестной ошибкой, ищите программу Dependency Walker, открывайте там проект и смотрите, все ли библиотеки имеют нужную разрядность и какие вообще там есть проблемы.
Если всё хорошо, копию файла windeployqt.exe из папки проекта можно удалить, а также почистить вложенную папку translations от «лишних» языков, оставив только qt_en.qm и qt_ru.qm
Мой виджет из 27 Кб стал 52 Мб, но теперь запускается без поиска .dll 🙂
08.05.2021, 10:58 [1363 просмотра]
Скомпилированная программа на Qt просит библиотеку qt5cored.dll, где искать?
Добрый день!
Осваиваю азы C++ на Qt
Написал аля Hellow world. Пробую запустить вне Qt, пишет, что нужна библиотека qt5cored.dll, т.е. именно с «d», я такую не нашёл и гугл мне ничего путного не выдал. Пробовал переименовать qt5core.dll в qt5cored.dll, пишет, что не может найти вход в библиотеку.
Ещё пару мелких вопросов, что-то путёвого ответа в гугле не нашёл.
1)Как убрать ошибку при запуске проекта в релизе «Не удалось получить идентификатор подчинённого процесса: Параметр задан неверно.», но при этом запускается
2)Хоть я и нажимаю собрать проект в релиз, он не собирается в итоге, но запускается (т.е. нет exe в папке релиз), а вот в режиме отладки таких проблем нету, это связано с предыдущей ошибкой?
3) Скачал Qt Creator (Community), а в нём можно встраивать библиотеки в исполняемый файл? Или так и придётся таскать .dll все с проектом
#include int main()

Как-то удалось собрать в релиз, но уже нужна qt5core.dll, скопировал в проект, теперь вот что пишет
- Вопрос задан более трёх лет назад
- 5855 просмотров
1 комментарий
Оценить 1 комментарий