Если интересно как создать динамическую библиотеку. Если интересно, почему вместе с «.dll» в результате сборки проекта получаем и «.lib» файл, тогда Вам сюда!;)

Создание библиотеки не отличается своей сложностью. Для её создания необходимо в среде программирования «VisualStudio» выбрать пункт «File->New->Project->Win32->Win32 Console Application». Дальше указать путь и имя будущей библиотеки.

 

DynamicLibraryNewProject

 

Потом жмем «Next» до тех пор, пока не увидим «RadioBox» с надписью «DLL» (это диалог «Application Settings»).

 

DynamicLibraryApplicationSettings

 

Жмем «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»:

 

DynamicLibraryPreprocessorDefinitions

 

В этом случае будет сконфигурирован заголовочный файл, нужный для создания динамической библиотеки. В проектах же, которые будут использовать данный заголовок (если когда-то будет создан другой проект, использующий заголовочный файл созданной нами библиотеки), объявления 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»

 

Значение этого поля следует установить так, как показано на рисунку ниже:

 

DynamicLibraryCreateUsePrecompilerHeader

 

В следующем посте мы создадим проект, который в свою очередь будет использовать только что созданную нами динамическую библиотеку.

 

Загрузка

Скачать исходные файлы проекта