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

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

  • автор:

Динамические библиотеки в Qt

До начала работы с библиотекой Qt я программировал различные задачки на С++ в университете, а на работе использовал Delphi. И конечно же, в процессе работы создавались различные библиотеки. Создавались, можно сказать, с трудом. Не хватало в повседневной жизни тех плюсов, которые давало ООП. Всегда хотелось экспортировать из библиотек целые классы, причем делать это просто, быстро и беззаботно. При этом вопросы о создании библиотек на С++ и дальнейшем их использовании в проектах на Delphi или C возникали очень редко.

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

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

В процессе работы ставилось множество задач, одной из которых и было создание единой методики создания библиотек для нужд проекта. Чтобы этой методикой могли воспользоваться начинающие программисты участвующие в разработке. Она достаточно простая и опытные разработчики используют ее не задумываясь.

Большая часть изменений касается *.pro файла Вашей будущей библиотеки:

  1. # Мы создаем библиотеку
  2. # В указанную директорию относительно директории, в которой находится
  3. # pro-файл будут помещены бинарные файлы библиотеки.
  4. TEMPLATE = lib
  5. DESTDIR = dist
  6. # Версия библиотеки.
  7. VERSION = 1 . 0 . 0
  8. # Задаем имя нашей библиотеки
  9. TARGET = $$ qtLibraryTarget ( MyLibrary )
  10. # Указываем, что собирать надо release и debug версии библиотек
  11. CONFIG += build_all
О функции qtLibraryTarget
  • MyLibrary1.dll — release-сборка библиотеки. (Номер версии берется из старшего разряда, указанного в теге VERSION. Например, VERSION = 1.0.0, следует номер версии библиотеки будет равен 1)
  • MyLibraryd1.dll — debug-сборка библиотеки.
Правим код

Теперь необходимо настроить экспорт нашего кода из библиотек. Для этого создадим в новый заголовочный файл и назовем его, например, MyLibrary_global.h. Его содержимое должно быть таким (Creator создает этот файл автоматически при создании проекта динамической библиотеки):

  1. #ifndef MYLIBRARY_GLOBAL_H
  2. #define MYLIBRARY_GLOBAL_H
  3. #include
  4. #if defined(MyLibrary_LIBRARY)
  5. # define MyLibrary_EXPORT Q_DECL_EXPORT
  6. #else
  7. # define MyLibrary_EXPORT Q_DECL_IMPORT
  8. #endif
  9. #endif /* MYLIBRARY_GLOBAL_H */

Добавим созданный файл в проект:

  1. HEADERS += MyLibrary_global . h
  2. # И допишем обязательную строчку с макросом экспорта:
  3. DEFINES += MyLibrary_LIBRARY
Экспорт классов и функций

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

  1. #include «MyLibrary_global.h»
  2. class MyLibrary_EXPORT ComputerManager : public QObject
  3. Q_OBJECT
  4. .
  5. >
  6. // или функцию:
  7. MyLibrary_EXPORT QDebug operator
О сборке библиотек в linux

Как уже было сказано, при сборке библиотеки в linux постфикс типа сборки не ставится (в этом можно убедиться, посмотрев реализацию этой функции qtLibraryTarget в исходниках qt). Но и это не беда, достаточно немного подправить строки в pro-файле:

  1. # Если операционная система из семейства unix
  2. unix :
  3. CONFIG ( debug , debug | release )
  4. # Такое название имеет debug-версия библиотеки
  5. TARGET = ComputerManagerd
  6. >else
  7. # А такое release-версия
  8. TARGET = ComputerManager
  9. >
  10. >else
  11. TARGET = $$ qtLibraryTarget ( ComputerManager )
  12. >
  13. VERSION = 1 . 0 . 0
  14. # Первый параметр необходим для сборки #библиотеки в linux (qmake, make all),
  15. # второй для сборки под остальными ОС.
  16. CONFIG += debug_and_release build_all
  17. # Указываем папки для объектных файлов. Для unix-подобных ОС это критично.
  18. # Если этого не сделать, то будет собираться только release версия библиотеки,
  19. # либо только отладочная. Связано это с тем, что файлы будут замещать друг друга.
  20. CONFIG ( debug , debug | release )
  21. OBJECTS_DIR = build / debug
  22. >else
  23. OBJECTS_DIR = build / release
  24. >

Эта часть pro-файла будет создавать одновременно динамические библиотеки в debug и release версиях на windows, linux, mac.

Использование библиотеки

В pro-файле проекта необходимо дописать строки:

  1. # Подключаем заголовочные файлы библиотеки
  2. INCLUDEPATH += include / MyLibrary
  3. CONFIG ( debug , debug | release )
  4. # Подключаем debug-версии библиотек для разных платформ
  5. win32 : LIBS += — Llib — lMyLibraryd1
  6. unix : LIBS += — Llib — L . — lMyLibraryd — Wl ,- rpath , lib — Wl ,- rpath ,.
  7. >else
  8. # Подключаем release-версии библиотек для разных платформ
  9. win32 : LIBS += — Llib — lMyLibrary1
  10. unix : LIBS += — Llib — L . — lMyLibrary — Wl ,- rpath , lib — Wl ,- rpath ,.
  11. >

При этом подразумевается, что в корне вашего проекта имеется две папки:
lib — Содержит бинарные файлы библиотеки. include — содержит папку MyLibrary со всеми заголовочными файлами библиотеки.

Заключение

Библиотека Qt является удобным инструментом реализации ваших идей и проектов. Она сильно упрощает жизнь программисту, потому что создание библиотек в проектах на Qt — очень простая и понятная задача.

Подсветка синтаксиса: Редактор Блогов от © SoftCoder.ru

  • qt
  • динамическая библиотека
  • разработка

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.

Программа требует DLL

Всем привет. Решил попробовать Qt. А так программирую много лет в других средах. Скачал offline установщик 4.14.2. Установил по молчанию. Не смог создать простую программу, что-то там не так было с пакетами. Переустановил со всеми пакетами. встало. делаю простую консольную программу с выводом версии Qt из QtCerator. Запускается, показывает номер версии. Запускаю exe уже не из среды. Говорит что нет Qt5Core.dll. Беру её из bin. запускаю. Теперь нет vcruntime140_app.dll. А её вообще нет ни где на ПК. Качаю из инета. Подошла при чём не любая. Запускаю. теперь нужно api-ms-win-core-rtlsupport-l1-2-0.dll, её так же нет. Качаю. Опять запускаю, уже нужно api-ms-win-core-memory-l1-1-2.dll. Качаю, опять же не любая, так как то точки входа в одну их функций там нет, то вообще такой-то функции нет. В общем на 6-7-й dll по счёту когда дошло до api-ms-win-core-errorhandling-l1-1-1.dll, меня это задолбало. Почему оно из QtCreator запускает и не требует ничего, а тут вообще какой-то мрак. Как отрубить желание программы этих сторонних DLL? Наконец, где взять пакет всех этих левых DLL сразу и чтобы работало?

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

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

не запускается программа для QT в Code::Block — требует DLL
Всем привет, я начал изучать qt, установил code::block, установил qt SDK с сайта нокиа. .

Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?
Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?

Почему Qt требует все dll?
Есть проект на Qt, подключал core gui webkitwidgets network Логично, что он требует Qt5Core.

396 / 297 / 59
Регистрация: 29.05.2018
Сообщений: 933

Скорее всего, вам нужно просто собрать к полученному экзешнику все dll-ки. Это можно сделать с помощью следующих программ:
— windeployqt (входит в комплект поставки самого Qt, ищите в папке bin);
— CQtDeployer;
— LibraryCollector https://www.cyberforum.ru/blog. g2457.html

Регистрация: 27.03.2016
Сообщений: 47

windeployqt есть для разных сборок под 2015, 2017. Но не ясно как ей пользоваться и как собирать dll. Да и судя по всему проблемы с dll, которые не входят в QT, а входят в состав VCRedist. Я скачал пак для многих версий и установил. При попытке запустить свою программу и добрасывания в неё DLL, скачанных из сети (ещё до установки VCRedist пака) я остановился на том, что программа пишет «Точка входа в процедуру RaiseExeption не найдена в библиотеке DLL api-ms-win-core-errorhandling-l1-1-1.dll. Перепробовал разные 32-х разрядные api-ms-win-core-errorhandling-l1-1-1.dll, не помогло. Возникает два резонных вопроса 1) Как она тогда успешно запускается из QTCreator? 2) Нафига нужны все эти DLL и с как скомпилировать EXE файл, чтобы он их не просил?

Добавлено через 49 минут
При чем, после добавления в директорию с программой этих самых DLL. где всё обваливается с сообщением «Точка входа в процедуру RaiseExeption не найдена в библиотеке DLL api-ms-win-core-errorhandling-l1-1-1.dll» она не запускается из из QtCreator. Хотя MessageBox не пишется но в «Вывод приложения» появляется например такая строка «C:\Qt\Qt5.14.2\TIL_000\build-TIL_000-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\debug\TIL_000.exe завершился с кодом -1073741511». Стоит стереть все эти библиотеки из этой директории, как оно из QtCreator запускается вполне себе. Были мысли, что Qt это нечто глючное, но не думал, что на столько.

5006 / 4686 / 985
Регистрация: 11.10.2019
Сообщений: 12,251

Burster, если правильно помню, качай отсюда онлайн инсталлер https://download.qt.io/officia. nstallers/

но нужно создать аккаунт https://login.qt.io/login для community

всё это — бесплатное.

Добавлено через 1 минуту

ЦитатаСообщение от Burster Посмотреть сообщение

Беру её из bin. запускаю
из какой именно bin? Из папки с Qt или с QtCreator?
Регистрация: 27.03.2016
Сообщений: 47

Онлайн инсталлер не хотелось бы. Я скачал оффлайн. Чтобы можно было поставить потом пакет на машины где нет вообще сети или интернет очень медленный. Методом проб и выкачиваний дошёл до того, что нужно найти api-ms-win-core-localization-l1-2-2.dll. Только поиск пока ничего не дал. Есть в сети localization-l1-2-1.dll, но она после переименовки не имеет нужной какой-то там ф-ции. Qt5Core.dll брал из msvc2017. Но, в установленной Qt она есть в разных диекториях и они по ходу разные. Попробую другие. А вообще, можно ли скомпилировать так ,чтобы весь код программы был в exe и не нужно было бы никаких dll?

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

Инструментарий

Операционная система: Windows 7
Версия Qt: Qt 5.2.0 for Windows 32-bit (MinGW 4.8, OpenGL)

Создание Dll

— запускаем Qt Creator
— в меню выбираем «File» -> «New File or Project. »
— в разделе «Projects» выбираем «Libraries»
— в центральном разделе выбираем «C++ Library» -> нажимаем кнопку «Choose. »
— в выпадающем списке: Shared Library
— имя проекта: Person
— выбираем путь, где будет создан проект, к примеру: D:\Documents\Qt\QtDeploying\0001_dl l_Person
— нажимаем «Next» -> «Next» -> «Next» -> «Finish»

Изменяем файл «person.h» следующим образом:

#ifndef PERSON_H #define PERSON_H #include "person_global.h" #include class PERSONSHARED_EXPORT Person < public: Person(); Person(const QString &firstName, const QString &secondName, int age); QString firstName() const; void setFirstName(const QString &firstName); QString secondName() const; void setSecondName(const QString &secondName); int age() const; void setAge(int age); private: QString mFirstName; QString mSecondName; int mAge; >; #endif // PERSON_H

— создаём реализации для функций, для этого последовательно нажимаем правой кнопкой мыши по каждой функции и выбираем «Refactor» -> выбираем «Add difinition in person.cpp»

Изменяем файл «person.cpp» следующим образом:

#include "person.h" Person::Person() : mFirstName(""), mSecondName(""), mAge(0) < >Person::Person(const QString &firstName, const QString &secondName, int age) : mFirstName(firstName), mSecondName(secondName), mAge(age) < >QString Person::firstName() const < return mFirstName; >void Person::setFirstName(const QString &firstName) < mFirstName = firstName; >QString Person::secondName() const < return mSecondName; >void Person::setSecondName(const QString &secondName) < mSecondName = secondName; >int Person::age() const < return mAge; >void Person::setAge(int age)

Создадим debug-версию dll:

— в меню выбираем «Build» -> «Build Project Person»

Создадим release-версию dll:

— нажимаем кнопку «Projects» на панели слева
— в разделе «Build Settings» в списке «Edit build configuration» выбираем: Release
— в разделе «Build Steps» напротив «qmake» нажимаем «Details»
— в списке «qmake build configuration» выбираем «Release»
— в поле «Additional arguments» вводим (в двойных кавычках): «CONFIG += release»
— в меню выбираем «Build» -> «Build Project Person»
— переходим в папку «release» проект, там находится dll «Person.dll»
— теперь мы можем использовать в других проектах файлы: person.h, person_global.h и Person.dll

Использование Dll

— в меню выбираем «File» -> «New File or Project. »
— в разделе «Projects» выбираем «Applications»
— в центральном разделе выбираем «Qt Console Application» -> нажимаем кнопку «Choose. »
— имя проекта: UsageOfPersonDll
— выбираем путь, где будет создан проект, к примеру: D:\Documents\Qt\QtDeploying\0002_Us ageOfPersonDll
— нажимаем «Next» -> «Next» -> «Finish»
— копируем в папку с проектом файлы: person.h, person_global.h и Person.dll
— подключаем к проекту файлы «person.h» и «person_global.h», для этого кликаем правой кнопкой мыши по имени проекта в Qt Creator и выбираем «Add Existing Files» -> выделяем «person.h» и «person_global.h» -> нажимаем «Open»
— в меню выбираем «Build» -> «Build Project UsageOfPersonDll»
— копируем файл «Person.dll» из папки «debug» проекта «Person» в папку «debug» проекта «UsageOfPersonDll»
— копируем файл «Person.dll» из папки «release» проекта «Person» в папку «debug» проекта «UsageOfPersonDll»

— открываем файл «UsageOfPersonDll.pro» и добавляем следующую строку (путь к «Person.dll»):

LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\Person.dll"

Примечание. Для построения релизной версии проекта нужно в «UsageOfPersonDll.pro» добавить эту строку:

LIBS += "..\build-UsageOfPersonDll-Desktop_Qt_5_2_0_MinGW_32bit-Release\release\Person.dll"

Изменяем файл «main.cpp» следующим образом:

#include #include "person.h" #include int main(int argc, char *argv[])

— в меню выбираем «Build» -> «Run» (или Ctrl+R)

8Observer8
Посмотреть профиль
Найти ещё сообщения от 8Observer8

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

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