4882

Статические и динамические библиотеки

Лекция

Информатика, кибернетика и программирование

Статические и динамические библиотеки. Библиотеками называют сборники подпрограмм или объектов, как правило, ориентированных на решение набора близких по тематике задач. С точки зрения их организации и использования библиотеки бывают статическими ...

Русский

2012-11-28

200.5 KB

32 чел.

Статические и динамические библиотеки.

Библиотеками называют «сборники» подпрограмм или объектов, как правило, ориентированных на решение набора близких по тематике задач. С точки зрения их организации и использования библиотеки бывают статическими и динамическими.

Статические библиотеки (static library) могут представлять собой набор исходных кодов, подключаемых программистом в свою программу, либо в виде заранее скомпилированных объектных файлов, связываемых вместе на этапе компиляции. В Windows такие файлы обычно имеют расширение <.lib>. В результате связывания со статической библиотекой, программа включает все используемые ей функции, что увеличивает её размер, но делает более автономной.

Динамические библиотеки (shared library, dynamic link library) загружаются операционной системой по «требованию» запущенной программы уже в ходе её выполнения. Если необходимая библиотека уже была загружена в память, то повторная загрузка не выполняется. При этом один и тот же набор функций или объектов библиотеки может быть использован одновременно несколькими работающими программами, что позволяет эффективно использовать ресурсы оперативной памяти. Динамические библиотеки в Windows обычно имеют расширение <.dll>.

 Для использования библиотеки необходимо указать компилятору, что нужно её подключить и вызвать функцию из библиотеки (воспользовавшись соответствующим заголовочным файлом), при этом исходный текст функции не нужен.

Создание динамической библиотеки.

В Microsoft Visual Studio создание проекта для построения динамической библиотеки аналогично привычной процедуре создания проекта косольного приложения. Тип проекта Win32 Console Application, только теперь в мастере создания проекта нужно быдет выбрать пункт «DLL»:

В случае, если такой пункт в мастере отсутствует, можно создать обычный проект Console Application, а затем в свойствах проекта задать его тип:

Configuration Properties => General => Configuration Type : Dynamic Library (.dll)

Далее, добавим в проект модуль (т.е пару из h- и cpp- файлов) с таким кодом:

// dlltest.h

__declspec(dllexport) void display( const char * str );

// dlltest.cpp

#include "dlltest.h"

#include <iostream>

void display( const char * str )

{

  std::cout << str << std::endl;

}

Модификатор __declspec(dllexport) разрешает экспорт библиотекой указанной функции для использования её другими приложениями.

В результате сборки проекта будет создан файл динамической библиотеки с расширением <.dll>, а также файл библиотеки импорта с расширением <.lib>. Библиотека импорта предназначена для облегчения последующего использования динамической библиотеки. Несмотря на то, что расширение файла библиотеки импорта совпадает со стандартным расширением статических библиотек, путать их не стоит.

 

 Использование динамической библиотеки.

 

Использовать динамическую библиотеку в программе можно двумя способами. Неявное связывание подразумевает использование библиотеки импорта для  определения адресов функций, предоставляемых библиотекой. Операционная система загружает библиотеку DLL после загрузки исполняемого файла программы. Исполняемый файл вызывает экспортированные функции библиотеки DLL таким способом, как если бы функции содержались в самом исполняемом файле.

При явном связывании исполняемый файл, использующий библиотеку DLL, должен делать вызовы функции для явной загрузки и выгрузки библиотеки DLL и осуществления доступа к экспортированным функциям библиотеки DLL. Клиентский исполняемый файл вызывает экспортированные функции с помощью указателя функции.

Независимо от выбранного метода исполняемый файл может использовать одну и туже библиотеку DLL. Более того, эти механизмы не являются взаимоисключающими, поскольку в то время как один исполняемый файл неявно связывается с библиотекой DLL, другой может выполнять явное связывание.

В качестве примера воспользуемся механизмом неявного связывания (как наиболее простого) для подключения построенной простой библиотеки.

Создадим отдельный проект обычного консольного приложения (можно в рамках того же решения, что и проект самой библиотеки). Для использования функции display, реализованной в библиотеке, необходимо:

  1.  Подключить соответствующий заголовочный файл  “dlltest.h”. Для этого нужно либо использовать путь к файлу непосредственно в директиве #include (если проекты находятся в одной папке решения, то лучше использовать относительный путь), либо в свойствах проекта добавить путь к этому заголовочному файлу в разделе

Configuration Parameters =>  C/C++  =>  General => Additional Include Directories

  1.  Использовать файл соответствующей библиотеки импорта. Для этого можно воспользоваться директивой вида (здесь использован относительный путь к построенному lib-файлу).

#pragma comment( lib, "../Debug/dlltest.lib" )

Кроме того, можно добавить путь к файлу библиотеки импорта в свойствах проекта в разделе

Configuration Parameters => Linker => Input => Additional Dependencies

 Теперь создадим основной файл программы с таким содержимым:

#pragma comment( lib, "../Debug/dlltest.lib" )

#include "dlltest.h"

#include <iostream>

void main()

{

  display( "Hello" );

  system( "pause" );

}

Для успешного запуска программы осталось только обеспечить доступность соответствующей DLL библиотеки. При запуске программы операционная система будет искать все требуемые файлы библиотек в папке, откуда была запущена программа, а также в системных путях, определеннных переменной окружения PATH. Соответственно, DLL файл построенной библиотеки должен либо лежать в одной папке вместе с исполняемым файлом вызывающей программы, либо в одной из папок, определенных в PATH.


 

А также другие работы, которые могут Вас заинтересовать

38022. Лабораторная работа № 3 ПРЕДСТАВЛЕНИЕ И РЕАЛИЗАЦИЯ АТД ДЕРЕВО Цель работы: исследовать и изучить АТД. 1.59 MB
  n] of integer; vr :tree; Реализация деревьев с использованием списков сыновей. Списки сыновей составляются для каждого узла.1 можно составить соответствующие списки сыновей рис.5 Тип для реализации АТД дерево через списки сыновей рис.
38023. ПРЕДСТАВЛЕНИЕ И РЕАЛИЗАЦИЯ «БИНАРНОГО ДЕРЕВА» 197.5 KB
  нет копий одного и того же элемента. Дерево бинарного поиска – это так же бинарное дерево узлы которого помечены элементами множеств. Свойство данного дерева заключено в том что все элементы левого поддерева любого узла x меньше элемента узла x а элементы правого поддерева больше чем x. Первое поле element – это поле в котором храниться значение самого элемента множества.
38024. ИЗУЧЕНИЕ АТД «СЛОВАРЬ», «ФАЙЛ» И «НАГРУЖЕННОЕ ДЕРЕВО» 341 KB
  Временами так же возникает необходимость проверки присутствия элемента в этом множестве. Словарь можно реализовать тремя способами: 1посредством сортированных или не сортированных связанных списков; 2при помощи двоичных векторов если элементы данного множества целые числа; 3используя массив фиксированной длины с указателем на последнюю заполненную ячейку этого массива если размер множества не превышает заданную длину массива в противном случае используются связанные списки. Начальное значение сегмента всегда меньше значений элементов его...
38025. Карты изображений 1.45 MB
  подробное описание областей нанесенных на контурную карту: mp nme= Mp re shpe= rect coords= 226074 href= ссылка на Google.ru re shpe= rect coords= 61411276 href= ссылка на мой сайт mp Примечание: жирным выделено то что должно присутствовать обязательно обычным текстом переменные параметры. mp nme= Mp2 re shpe= circle coords= 842826 href= http: google.ru re shpe= poly coords= 65351417858109481107177546345 href= http: srez.
38026. Элементарные таблицы 60 KB
  Если значение ноль то рамка не требуется; cellpdding= cellspcing= добавляют свободное пространство между данными ячейки и ее границами и между ячейками таблицы соответственно. th т th контейнер ячейки Заголовок : заголовок столбца или строки. Значения: left заголовок прижать к левому краю ячейки center заголовок расположить по центру ячейки right заголовок прижать к правому краю ячейки; vlign= задает положение данных в ячейке Заголовок по вертикали. Значения: bottom заголовок прижать к нижнему краю ячейки middle заголовок...
38027. Продолжение разговора о ссылках 63.5 KB
  Способ первый с помощью атрибута nme имя закладки тэга : Заголовки стих первый стих второй стих третий в нашем примере мы сделали закладками использовав атрибут тэга nme: Заметьте href= stih3 символ решетки перед именем закладки на которую мы ссылаемся обязателен.
38028. Создание форм 45.5 KB
  Помимо атрибута type большинство элементов управления требуют указания атрибутов nme и vlue для идентификации имени и исходного значения если таковое имеется. Вот пример кода создающего текстовое поле: input type=â€text†nme=â€usernme†vlue=â€â€ Этот код может пригодиться при создании текстового поля для ввода имени пользователя при подключении к Webузлу. Для полноты картины можно дополнить его полем пароля: input type=â€pssword†nme =“userpss†vlue=â€â€ обратите внимание что атрибуту vlue в обоих случаях присвоено...
38029. Создание фреймов 729 KB
  HTML программа имеющая структуру кадров не должна содержать контейнеры body и наоборот. Обычно это файл HTML программы из того же каталога папки что и сам контейнер но может быть и абсолютный адрес файла с любого компьютера. nofrmes т nofrmes контейнер HTML текста для броузеров которые не поддерживают аппарат кадров. Левый фрейм Верхний правый фрейм Нижний правый фрейм Листинг: главный файл html hed title фреймы title hed frmeset cols= 4 frme frmeborder=yes src= left.
38030. Каскадные таблицы стилей 63.5 KB
  Каскадные таблицы стилей Основным понятием CSS является стиль т. CSS действует другим более удобным и экономичным способом. Кроме того CSS позволяет работать со шрифтовым оформлением страниц на гораздо более высоком уровне чем стандартный HTML избегая излишнего утяжеления страниц графикой. Практическое освоение CSS Как вам уже известно информация о стилях может располагаться либо в отдельном файле либо непосредственно в коде Webстранички.