Введение
До начала работы с библиотекой Qt я программировал различные задачки на С++ в университете, а на работе использовал Delphi. И конечно же, в процессе работы создавались различные библиотеки. Создавались, можно сказать, с трудом. Не хватало в повседневной жизни тех плюсов, которые давало ООП. Всегда хотелось экспортировать из библиотек целые классы, причем делать это просто, быстро и беззаботно. При этом вопросы о создании библиотек на С++ и дальнейшем их использовании в проектах на Delphi или C возникали очень редко.
И вот я участвую в разработке своего первого проекта с использованием библиотеки Qt. Чтение книг, ассистента, форумов, статей и идеи, идеи, идеи. Проект большой, содержит множество компонентов, а опыт наша команда набирала, скажем так, в боевых условиях.
Создание библиотеки
В процессе работы ставилось множество задач, одной из которых и было создание единой методики создания библиотек для нужд проекта. Чтобы этой методикой могли воспользоваться начинающие программисты участвующие в разработке. Она достаточно простая и опытные разработчики используют ее не задумываясь.
Большая часть изменений касается *.pro файла Вашей будущей библиотеки:
- # Мы создаем библиотеку
- # В указанную директорию относительно директории, в которой находится
- # pro-файл будут помещены бинарные файлы библиотеки.
- TEMPLATE = lib
- DESTDIR = dist
- # Версия библиотеки.
- VERSION = 1.0.0
- # Задаем имя нашей библиотеки
- TARGET = $$qtLibraryTarget(MyLibrary)
- # Указываем, что собирать надо release и debug версии библиотек
- CONFIG += build_all
О функции qtLibraryTarget
Функция $$qtLibraryTarget дополняет название нашей библиотеки номером версии и постфиксом типа сборки (“d” — в windows, “_debug” — в mac, в linux постфикса нет). То есть в после сборки в папке назначения мы увидим файлы (windows):
- MyLibrary1.dll — release-сборка библиотеки. (Номер версии берется из старшего разряда, указанного в теге VERSION. Например, VERSION = 1.0.0, следует номер версии библиотеки будет равен 1)
- MyLibraryd1.dll — debug-сборка библиотеки.
Правим код
Теперь необходимо настроить экспорт нашего кода из библиотек. Для этого создадим в новый заголовочный файл и назовем его, например, MyLibrary_global.h. Его содержимое должно быть таким (Creator создает этот файл автоматически при создании проекта динамической библиотеки):
- #ifndef MYLIBRARY_GLOBAL_H
- #define MYLIBRARY_GLOBAL_H
-
- #include <QtCore/qglobal.h>
-
- #if defined(MyLibrary_LIBRARY)
- # define MyLibrary_EXPORT Q_DECL_EXPORT
- #else
- # define MyLibrary_EXPORT Q_DECL_IMPORT
- #endif
-
- #endif /* MYLIBRARY_GLOBAL_H */
Добавим созданный файл в проект:
- HEADERS += MyLibrary_global.h
- # И допишем обязательную строчку с макросом экспорта:
- DEFINES += MyLibrary_LIBRARY
Экспорт классов и функций
И теперь самое главное. Во всех классах и функциях, которые должны быть видны снаружи библиотеки, необходимо дописать определенный ранее макрос MyLibrary_EXPORT (эти файлы будут заголовочными и должны поставляться вместе с бинарными файлами библиотеки). Например, мы хотим экспортировать класс:
- #include "MyLibrary_global.h"
- class MyLibrary_EXPORT ComputerManager: public QObject {
- Q_OBJECT
- ...
- }
- // или функцию:
- MyLibrary_EXPORT QDebug operator<<(QDebug d, const MyObject &object);
О сборке библиотек в linux
Как уже было сказано, при сборке библиотеки в linux постфикс типа сборки не ставится (в этом можно убедиться, посмотрев реализацию этой функции qtLibraryTarget в исходниках qt). Но и это не беда, достаточно немного подправить строки в pro-файле:
- # Если операционная система из семейства unix
- unix: {
- CONFIG (debug, debug|release) {
- # Такое название имеет debug-версия библиотеки
- TARGET = ComputerManagerd
- } else {
- # А такое release-версия
- TARGET = ComputerManager
- }
- } else {
- TARGET = $$qtLibraryTarget(ComputerManager)
- }
- VERSION = 1.0.0
- # Первый параметр необходим для сборки #библиотеки в linux (qmake, make all),
- # второй для сборки под остальными ОС.
- CONFIG += debug_and_release build_all
- # Указываем папки для объектных файлов. Для unix-подобных ОС это критично.
- # Если этого не сделать, то будет собираться только release версия библиотеки,
- # либо только отладочная. Связано это с тем, что файлы будут замещать друг друга.
- CONFIG (debug, debug|release) {
- OBJECTS_DIR = build/debug
- } else {
- OBJECTS_DIR = build/release
- }
Эта часть pro-файла будет создавать одновременно динамические библиотеки в debug и release версиях на windows, linux, mac.Использование библиотеки
В pro-файле проекта необходимо дописать строки:
- # Подключаем заголовочные файлы библиотеки
- INCLUDEPATH += include/MyLibrary
- CONFIG(debug, debug|release) {
- # Подключаем debug-версии библиотек для разных платформ
- win32: LIBS += -Llib -lMyLibraryd1
- unix: LIBS += -Llib -L. -lMyLibraryd -Wl,-rpath,lib -Wl,-rpath,.
- } else {
- # Подключаем release-версии библиотек для разных платформ
- win32: LIBS += -Llib -lMyLibrary1
- unix: LIBS += -Llib -L. -lMyLibrary -Wl,-rpath,lib -Wl,-rpath,.
- }
При этом подразумевается, что в корне вашего проекта имеется две папки:
lib — Содержит бинарные файлы библиотеки. include — содержит папку MyLibrary со всеми заголовочными файлами библиотеки.
Заключение
Библиотека Qt является удобным инструментом реализации ваших идей и проектов. Она сильно упрощает жизнь программисту, потому что создание библиотек в проектах на Qt — очень простая и понятная задача.
Подсветка синтаксиса: Редактор Блогов от © SoftCoder.ru