1. Инкапсуляция динамической библиотеки
1. Сначала создайте новый проект библиотеки
2. Измените тип на разделяемую библиотеку, настройте имя проекта и путь к проекту.
3. Выберите компилятор
4. Выберите модули, необходимые для динамической библиотеки.
5. Настройте имя класса, нажмите «Далее».
6. Нажмите Далее
7. Обзор проекта
8. В данный момент в файле нет файла ui, потому что для инкапсуляции динамической библиотеки с интерфейсом нужно щелкнуть проект правой кнопкой мыши -> добавить новый
9. Выберите Qt -> Класс интерфейса дизайнера Qt в новом всплывающем окне.
10. Выберите шаблон интерфейса виджета
11. Назовите его так же, как текущий проект, чтобы перезаписать предыдущий файл без пользовательского интерфейса.
12. Нажмите Готово
13. После этого появятся следующие два окна, нажмите OK и Да для всех соответственно.
14. На этом этапе вы можете видеть, что в файле проекта есть больше файлов .ui.
15. Нажмите на файл .pro, чтобы удалить повторяющийся контент.
16. Если файл сообщает красный цвет, это означает, что некоторые модули отсутствуют (отсутствует модуль виджетов)
17. Добавьте следующее, ошибка может исчезнуть
18. Однако проект в настоящее время не может быть напрямую упакован в динамическую библиотеку, потому что старый файл перезаписывается, а новый файл не может быть упакован в динамическую библиотеку, поэтому новый файл необходимо изменить.
I. На данный момент содержимое нового файла DynamicLib.h выглядит следующим образом:
II.Его необходимо изменить до следующего содержания:
необходимо добавить заголовочный файл #include "dynamiclib_global.h"
и добавить оператор перед именем класса DYNAMICLIBSHARED_EXPORT
.
III. DYNAMICLIBSHARED_EXPORT
Оператор может быть скопирован непосредственно в заголовочный файл dynamiclib_global.h
, который является частью, обведенной красным прямоугольником в приведенном ниже коде:
19. Добавьте кнопку на этот интерфейс и добавьте к этой кнопке соответствующую функцию слота.
20. Напишите содержание функции слота
21. Затем нажмите «Сборка и запуск», чтобы сгенерировать файл динамической библиотеки.
22. Сгенерированный файл библиотеки находится в собственной папке Debug.
23. Еще один файл, который необходимо использовать, это собственный заголовочный файл, dynamiclib_global.h
который также необходимо привести
На этом инкапсуляция динамической библиотеки завершена, и необходимо использовать четыре файла, отмеченные выше.
Во-вторых, вызов динамической библиотеки: использовать эту динамическую библиотеку в другом новом проекте.
1. Создайте новый проект с интерфейсом
2. Обзор проекта
3. Затем добавьте две новые папки include и lib в каталог проекта LibTest.
- Поместите файлы
DynamicLib.h
иdynamiclib_global.h
вinclude
папку - будет
DynamicLib.lib
помещенlib
в папку
4. Затем добавьте следующий оператор в файл LibTest.pro, чтобы импортировать динамическую библиотеку.
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib
Он указывает путь к заголовочному файлу, требуемому динамической библиотекой, путь, по которому находится динамическая библиотека, и имя динамической библиотеки. $$PWD указывает каталог проекта, а -l указывает имя файла библиотеки без суффикса .lib.
Затем добавьте файлы заголовков, которые необходимо использовать в файлах, использующих динамическую библиотеку для использования.
5. Затем приступайте к редактированию mainwindow.ui
Добавьте компонент StackedWidget, поместите кнопку на первую страницу, нажмите эту кнопку, перейдите на вторую страницу и поместите инкапсулированный интерфейс динамической библиотеки на вторую страницу.
6. Сначала добавьте функцию слота в pushButton
7. Затем добавьте объект DynamicLib в MainWindow и импортируйте заголовочный файл динамической библиотеки.
8. Добавьте следующий код в конструктор
9. В это время будет проблема: программа аварийно завершается и не может успешно работать.
10. Это потому, что есть еще файл, который не используется, то есть файл dll, и DynamicLib.dll
файл нужно поместить LibTest.exe
в папку того же уровня, иначе программа не может найти динамическую библиотеку при запуске, и программа рухнет
Так как это этап отладки, то файл LibTest.exe находится в папке отладки, так что сюда кидаем dll:
Таким же образом, после того, как релиз упакован, dll все еще может быть помещен в тот же каталог, что и exe-файл.
11. Затем пересоберите и запустите
Программа успешно запускается:
12. Нажмите кнопку, чтобы перейти ко второму интерфейсу.
13. Нажмите кнопку проверки еще раз.
Вы можете видеть, что строка напечатана ниже Dynamic Link Lib Test!!!
, указывая на то, что динамическую библиотеку можно вызывать в обычном режиме.
3. Дополнение: Простой метод
Если сейчас есть процесс GUI с именем CustomMessageBox, и вы хотите изменить его на DLL, вам необходимо внести следующие изменения ( обратите внимание, что красная часть — это заглавная буква имени класса, и вам нужно изменить содержимое красная текстовая часть в соответствии с реальной ситуацией. ):
1. Измените файл конфигурации
1 #TEMPLATE = app
2
3 DEFINES += CUSTOMMESSAGEBOX _LIBRARY
4 TEMPLATE = lib
2. Добавьте следующий код в заголовочный файл экспортируемого класса.
1 #если определено( CUSTOMMESSAGEBOX _LIBRARY)
2 # определить CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_EXPORT
3 #else
4 # определить CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_IMPORT
5 #endif
3. Измените определение класса экспорта
1 // класс CustomMessageBox : общедоступный QDialog
2 класс CUSTOMMESSAGEBOX SHARED_EXPORT CustomMessageBox : общедоступный QDialog
4. Скомпилируйте
Если это компилятор, вы найдете и файлы MinGW32
в папке после компиляции ; если это компилятор, это должно быть и .***.dll
***.a
MSVC
***.dll
***.lib
5. Используйте
В программе, использующей эту библиотеку, создайте новую include
папку, скопируйте ***.a
файл и 导出类的头文件
в эту папку, а заголовочный файл импортируйте в программу. После компиляции поместите dll
файлы, скомпилированные в разных режимах, в папку после компиляции программы, чтобы программа могла нормально работать.