5) запустили – можем при отладке «зайти» в функцию статической библиотеки
1) Библиотека - тип проекта Win32 dll (можно тут же указать Wizard-у - “Export Symbols”).
2) Экспортировали требуемую функцию (по желанию + данное) __declspec(dllexport). Замечание: .h-файл рекомендуется модифицировать таким образом (с помощью директив условной трансляции), чтобы его можно было использовать как библиотекой, так и вызывающим приложением.
3) Так как библиотека и клиент разработаны разными инструментами, следует экспортировать/импортировать по недекорированному имени
extern "C" {
#ifdef IMPLICIT
extern __declspec(dllexport) int Global_implicit;
__declspec(dllexport) int sub(int, int);
#else
extern Q_DECL_IMPORT int Global_implicit;
Q_DECL_IMPORT int sub(int, int);
#endif
}
4) Для удобства можно направить вывод (то есть создание файлов .dll и .lib) в папку Debug тестового приложения – Project\Properties\General\Output directory (тогда компоновщик создаст dll, lib и exp-файлы в указанной директории)
5) Лучше создавать Release-версию библиотеки (чтобы исключить вызов дополнительных проверочных функций, которые генерируются в Debug-версии проекта)
6) в результате компоновки должен быть создан а) .lib-файл, б) .dll-файл. Содержимое таблицы экспорта Вы можете посмотреть с помощью DumpBin имя.dll/EXPORTS. dumpbin.exe -out:t.txt -exports mydll.dll – в файл
· Подключить заголовочный файл библиотеки
· В проекте указать путь к h- файлу
INCLUDEPATH+= ../din_lib - это рабочий каталог библиотеки
· Компоновщику указать файл библиотеки импорта
LIBS+= ../lib/din_lib.lib
· Файл din_lib.dll должен находится в одной из тех директорий, где загрузчик ОС сможет его найти!
по аналогии с предыдущим заданием.
Замечания:
1. Заголовочный файл клиентом использоваться не будет => не обязателен
2. Понятия предназначены только для экспорта из библиотеки
3. Release-версия dll
Загрузка и использование dll осуществляется с помощью класса QLibrary:
1. QLibrary dll(QString(<спецификация_dll>));
2. Проверить: удалось ли загрузить dll, можно с помощью метода QLibrary:: isLoaded()
3. После того, как библиотека загружена, нужно получить из нее адрес требуемой функции посредством метода QLibrary:: resolve()
4. Если удалось добыть адрес, преобразовать возвращенное значение к требуемому типу
5. Вызвать функцию
6. Нужно ли явно освобождать библиотеку, загруженную таким способом???
Замечание 1: имя функции должно соответствовать имени, импортируемому из dll (а в dll оно может быть декорировано компилятором!!!)
Замечание 2: в качестве возвращаемого GetProcAddress() значения может выступать указатель на экспортируемое данное
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.