Если интересно как создать динамическую библиотеку. Если интересно, почему вместе с «.dll» в результате сборки проекта получаем и «.lib» файл, тогда Вам сюда!;)
Создание библиотеки не отличается своей сложностью. Для её создания необходимо в среде программирования «VisualStudio» выбрать пункт «File->New->Project->Win32->Win32 Console Application». Дальше указать путь и имя будущей библиотеки.
Потом жмем «Next» до тех пор, пока не увидим «RadioBox» с надписью «DLL» (это диалог «Application Settings»).
Жмем «Finish». Проект создан! Если вы видите в структуре проекта какие-либо файлы – смело удалите их. Для лучшего понимания лучше всё начать с чистого листа. Итак, нужно создать в проекте два следующих файла:
— файл имплементации «DynamicLibrary.cpp»,
— заголовочный файл «DynamicLibrary.h».
Содержимое файла «DynamicLibrary.cpp»:
1 2 3 4 5 |
#include "DynamicLibrary.h" double ADD(double a, double b) { return a+b; } |
Содержимое файла «DynamicLibrary.h»:
1 2 3 4 5 6 7 |
#pragma once #ifdef IS_CREATING_DLL #define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllexport) #else #define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllimport) #endif IMPORT_EXPORT_TRIGER double ADD(double a, double b); |
Бросается в глаза запись IMPORT_EXPORT_TRIGER, правда? Постараюсь объяснить подробнее. Для создания библиотеки необходимо перед прототипом функции набрать:
extern "C" __declspec(dllexport)
Эта запись как бы говорит: «Я создана для того, чтобы меня экспортировали из других программ».
В то же время, для того, чтобы использовать функцию в других программах нужно перед прототипом функции записать:
extern "C" __declspec(dllimport)
Эта же запись говорит: «Я хочу импортировать то, перед чем я записана, из DLL».
Получается, что нужно создавать два разных заголовочных файла для создания и дальнейшего использования библиотеки, но это же неудобно! В связи с этим, удобнее создать макрос, который и определяет, какую именно запись подставить в конкретном случае. Вот как, в нашем случае, выглядит этот макрос:
1 2 3 4 5 |
#ifdef IS_CREATING_DLL #define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllexport) #else #define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllimport) #endif |
Остается только где-то в проекте создания библиотеки объявить IS_CREATING_DLL. В данном случае объявление было добавлено в настройки проекта «Right click on DynamicLibrary project->Properties->C/C++->Preprocessor->Preprocessor Definitions»:
В этом случае будет сконфигурирован заголовочный файл, нужный для создания динамической библиотеки. В проектах же, которые будут использовать данный заголовок (если когда-то будет создан другой проект, использующий заголовочный файл созданной нами библиотеки), объявления IS_CREATING_DLL существовать не будет, вследствие чего будет выбрано объявление:
#define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllimport)
Теперь просто запускаем билд проекта. В результате мы должны получить файл с расширением «.lib» и расширением «.dll». «Постойте, – скажет внимательный читатель, – но что это за «.lib» файл? Разве нам нужен файл статической библиотеки? Мы же его не заказывали!». Это наверное самый интересный момент поста. Дело в том, что созданный «.lib» файл на самом деле не является статической библиотекой нашего проекта (т. е. сам по себе не содержит реализации функции ADD(…))! Для нас – это всего лишь файл, с расширением «.lib». Забегая наперед, могу сказать, что этот файл – это статическая библиотека, в которой реализован механизм подключения только что созданной нами динамической библиотеки. Если не совсем понятно написанное то не стоит отчаиваться. Все станет ясно в следующей статье. В ней будет описано, каким образом можно подключать динамическую библиотеку. А пока, всего сказанного (или же написанного) вполне достаточно для создания динамической библиотеки!
Вот собственное и всё. О чудо!!! Динамическая библиотека, которая содержит в себе одну единственную функцию, успешно создано! Поздравляю!!!:)
Дополнительные замечания. Если по каким-либо причинам Вы в процессе сборки проекта получаете сообщение об ошибке вроде этого:
«Error 1 fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»‘ to your source?»
Не стоит отчаиваться! Следует кое-что изменить в настройках проекта:
«Right click on MyDLL project->Properties->Configuration Properties->C/C++->Precompiled Headers->Create/Use Precompiled Header»
Значение этого поля следует установить так, как показано на рисунку ниже:
В следующем посте мы создадим проект, который в свою очередь будет использовать только что созданную нами динамическую библиотеку.
Загрузка
Скачать исходные файлы проекта