Какие dll файлы нужны в релизе qt
Перейти к содержимому

Какие dll файлы нужны в релизе qt

  • автор:

.dll файлы

Author24 — интернет-сервис помощи студентам

Здравствуйте, после написания программы и ее компиляции, я перекидываю сам .exe файл в отдельную папку, но он требует кучу .dll файлов. Как можно сократить их кол-во или наоборот убрать, чтобы программа была независимой от .dll?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Программа не требует .dll файлы после релиза
Здравствуйте, кодеры Использую QT Creator 4.7.1 (Community), и компилятор QT 5.9.1 MinGW 32bit .

.dll файлы для проекта, использующего postgres (QPSQL)
Всем привет! После сборки проекта "выпуск" я создаю папку и копирую в неё экзешник и все.

GUI приложение на Qt. Всегда ли нужно таскать с собой dll файлы?
Создал простое GUI приложение с помощью Qt. Но одного exe файла не хватает, приходится добавлять в.

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу.

Эксперт .NET

10591 / 6513 / 1508
Регистрация: 25.05.2015
Сообщений: 19,734
Записей в блоге: 14

Лучший ответ

Сообщение было отмечено Vestorn как решение

Какие dll добавить в проект Qt, чтобы на удаленном компьютере работал доступ к MySQL?

Добрый день. Пишу приложение на Qt , в котором использую MySQL . Пока запускаю у себя на компьютере, все работает, как только создаю проект и скидываю его коллеге, перестают обнаруживаться драйвера к MySQL . Пробовал и вручную закидывать нужные dll в папку, и собирать с помощью Windows Deployment Tool , но все без изменений. Подскажите, как быть?

Отслеживать
задан 25 окт 2017 в 8:51
Филипп Бондарев Филипп Бондарев
430 2 2 золотых знака 6 6 серебряных знаков 18 18 бронзовых знаков
Плагины Qt (qsqlmysql.dll) рядом с исполняемым файлом лежат?
25 окт 2017 в 9:31
@ixSci нет в папке sqlplugins , спасибо, я уже решил проблему.
25 окт 2017 в 9:33

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Скорее всего не хватает libmySQL.dll для работы драйвера QMYSQL. Сам файл можно взять в каталоге программы MySQL.

Отслеживать
ответ дан 25 окт 2017 в 8:57
4,030 1 1 золотой знак 11 11 серебряных знаков 19 19 бронзовых знаков
Пробовал. Пихал и в корневую папку и в sqldrivers . Все также.
25 окт 2017 в 9:09

Скинул dll’ку установленной на сервере MySQL 5.7×64 — заработало. Хотя у меня работает с MySQL 5.5×32. чудеса. Дело, верно, в том, что версия драйверов тоже x64 и компилю MSVC17x64. Ладно, спасибо вам.

25 окт 2017 в 9:32

Предлагаю свое РЕШЕНИЕ ПРОБЛЕМЫ.

При переносе релиза приложения Qt с MySql на др. компьютер и попытке запуска, выдавалось: SQL DRIVER NOT LOADED. Сейчас все РАБОТАЕТ. Как достиг этого: 1. В папке релиза, рядом с exe-шником, должна располагаться папка sqldrivers c файлом qsqlmysql.dll. Этот файл брал из: Пусть_установки_Qt\5.12.0\mingw73_64\plugins\sqldrivers

  1. В папке релиза, рядом с exe-шником, должен лежать файл libmysql.dll. Этот файл брал из: C:\Program Files\MySQL\MySQL Server 8.0\lib
  2. В папке релиза, рядом с exe-шником, должны лежать файлы libeay32.dll и ssleay32.dll. Эти файлы брал из: C:\Program Files\MySQL\MySQL Server 8.0\bin

Только при обязательном выполнении этих трех пунктов. Приложение — релиз, запускаемое на другом компе, нормально подключалось к Базе данных mysql.

Был потрачен день на поиск решения (на форумах много советов, но этого я не нашел в свое время). Надеюсь, кому-то пригодится!

Введение

Это руководство иллюстрирует разные подходы к созданию и применению пользовательских библиотек в приложении на Windows. Первая часть объясняет, как создать совместно используемую библиотеку и как присоединить ее к приложению. Вторая часть — о создании и использовании статической библиотеки.

Создание разделяемой библиотеки

При создании совместно используемой библиотеки, которую вы бы хотели присоединить, необходимо удостовериться, что символы, которые будут использованы за пределами библиотеки, будут должным образом экспортироваться после создания библиотеки. Впоследствии они будут импортированы при присоединении. Это может быть сделано с помощью Q_DECL_EXPORT и Q_DECL_IMPORT как показано в следующем примере:

#include #if defined TEST #define TEST_COMMON_DLLSPEC Q_DECL_EXPORT #else #define TEST_COMMON_DLLSPEC Q_DECL_IMPORT #endif class TEST_COMMON_DLLSPEC Widget : public QWidget  Q_OBJECT public: Widget(); >; 
#include #include "test.h" Widget::Widget() : QWidget() <> 
TEMPLATE = lib # Input SOURCES += test.cpp HEADERS += test.h DEFINES += TEST 

Присоединение разделяемой библиотеки к приложению

Чтобы использовать разделяемую библиотеку в приложении, вы можете включить ее заголовок в ваш код и использовать доступные методы. Скомпилируйте и соберите с.lib файл. Во время выполнения будет загружена dll, у которой имеется реализация.

Для успешной сборки, в файле .pro необходимо сообщить приложению, где найти заголовки и библиотеки. INCLUDEPATH должен указывать на каталог, где находятся заголовки, и LIBS переменная должна указывать на каталог с .lib файлом. Кроме того, необходимо удостовериться, что .dll будет находиться в указанном месте или помещена в каталог приложения или путь к ней описан в переменной PATH.

loadTestLib.pro

TEMPLATE = app TARGET = DEPENDPATH += . ../testLib INCLUDEPATH += ../testLib LIBS += -L../testLib/debug -ltestLib # Input SOURCES += main.cpp 
#include #include "test.h" int main(int argc, char *argv[])  QApplication a(argc, argv); Widget w; w.resize(100,100); w.show(); return a.exec(); > 

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

QLibrary может использоваться для загрузки разделяемых библиотек в момент выполнения. В этом случае достаточно иметь доступ только к .dll, доступ к заголовкам и .lib файлу(ам) не требуется.

Следующий пример показывает, как установить библиотеку для использования с QLibrary. Для разрешения имен функций, они должны быть экспортированы из библиотеки как C функции (т.е. без искажения имени). Это означает, что функции должны быть обернуты в блок extern «C», в случае если библиотека скомпилирована компилятором C.

Вот как делается это на Windows, также необходимо явно экспортировать функцию для использования DLL Q_DECL_EXPORT и Q_DECL_IMPORT

qlibraryLibrary.pro

TEMPLATE = lib HEADERS += widget.h SOURCES += widget.cpp DEFINES += TEST 
#include #if defined TEST #define TEST_COMMON_DLLSPEC Q_DECL_EXPORT #else #define TEST_COMMON_DLLSPEC Q_DECL_IMPORT #endif extern "C" TEST_COMMON_DLLSPEC QWidget* createWidget1(); 
#include #include "widget.h" QWidget* createWidget1()  QWidget *wid = new QWidget(); wid->resize(100,100); return wid; > 

Загрузка библиотеки, используя QLibrary

Чтобы загрузить библиотеку, используя QLibrary, можете просто передать .dll в конструктор QLibrary. Удостоверьтесь, что .dll доступна в каталоге приложения или в переменной PATH. Для того чтобы воспользоваться функциями библиотеки в приложении, вы должны разрешить их использование QLibrary::resolve().

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

#include int main(int argc, charargv)  QApplication app(argc, argv); QLibrary library("qlibraryLibrary.dll"); if (!library.load()) qDebug()  <library.errorString(); if (library.load()) qDebug()  <"library loaded"; typedef QWidget *(*CreateWidgetFunction)(void); CreateWidgetFunction cwf = (CreateWidgetFunction)library.resolve("createWidget1"); if (cwf)  QWidget* wid = cwf(); if (wid) wid->show(); > else  qDebug()  <"Could not show widget from the loaded library"; > return app.exec(); > 

Создание статической библиотеки

При создании статической библиотеки необходимо определить опцию staticlib CONFIG в .pro файле. В отличие от примера разделяемой библиотеки, в .h файле не требуется устанавливать никаких специальных символов для экспорта и импорта, потому как библиотека будет встроена в приложение, например:

TEMPLATE = lib CONFIG+= staticlib # Input HEADERS += test.h SOURCES += test.cpp 

Использование статической библиотеки в приложении

Подобно тому, как мы сделали это при загрузке разделяемой библиотеки, необходимо описать INCLUDEPATH, чтобы указать на каталог, где установлены заголовки и LIBS переменную, чтобы указать на .lib файл, например:

useStaticLib.pro

TEMPLATE = app TARGET = CONFIG+= console # Input SOURCES += main.cpp INCLUDEPATH += ../staticLibrary LIBS+= -L../staticLibrary/debug -lstaticLibrary 
#include #include "test.h" int main(int argc, char *argv[])  QApplication a(argc, argv); Widget w; w.resize(100,100); w.show(); return a.exec(); > 

Какой подход выбрать

Принятие решения о том, какой подход выбрать, зависит от Ваших потребностей.

При создании разделяемой библиотеки потребуется установить ее в целевой системе вместе с приложением. Преимущество: приложения собранные на разделяемых библиотеках, маленькие. Это независит от того, что используется для загрузки .dll, QLibrary или просто стандартное подключение. Важно, имеете ли вы доступ к заголовочным и .lib файлам или нет. Если доступа не имеете, тогда QLibrary -ваш выбор. Недостаток в том, что при отсутствии разделяемой библиотеки в системе приложение работать не будет.

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

  • Articles needing cleanup
  • HowTo
  • Developing with Qt::General
  • Tutorial

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

фотка 1

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

Консоль сборки показывает , что якобы все нормально:

фотка 2

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

фотка 3

А если посмотреть 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 в следующем месте :

фотка 4

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

фотка 5

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

Но рано радоваться , на другом ПК скорее всего вы увидите такое :

фотка 6

Файл 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *