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.


 

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

34800. Возрождение как синтез античности и средневековья. Антропоцентризм и проблема свободы личности 36 KB
  Первым литературным трудом Монтеня был предпринятый по просьбе отца перевод латинского трактата автор которого испанский теолог Раймунд Сабундский искал доказательства истинности католической веры в доводах человеческого естественного разума. Анализу воззрений испанского богослова и изложению собственных важнейших мыслей о религии посвящена Апология Раймунда Сабундского – самое обширное эссе Монтеня; работа над ним началась через семь лет после публикации перевода. Самые ранние из эссе Монтеня относятся к 1572 – году Варфоломеевской ночи и...
34801. Реализация и защита свободы совести и вероисповедания в РФ 432 KB
  Необходимость формирования правового механизма реализации права на свободу совести и вероисповедания связана с реальностью, когда соприкосновение со сферой религии отнюдь не исцеляет души, а ломает судьбы. И государство обязано проследить, чтобы свобода одних не оборачивалась болью для других///
34802. Пантеизм как специфическая черта натурфилософии возрождения. Диалектика ренессанса (Кузанский Бруно) социально-политическая модель Макиавелли 36.5 KB
  прямо не отрицая существования Бога она отождествляла его с природой. Теософия мудрость от Бога. Если учесть что познание от Бога а Бог непознаваем значит Бог предел познания. Бог это предел за которым нет знания но есть вера есть осознание Бога.
34803. Научная революция нового времени. Бэкон о естественной философии. Индуктивный метод. Источники заблуждений. Критика «идолов» 47 KB
  Бэкон о естественной философии. Бэкон Англия; С. В философии этого периода появляются два подхода к понятию субстанция: онтологическое понимание субстанции как предельного основания бытия основоположник Френсис Бэкон 1561 1626; гносеологическое осмысление понятия субстанция его необходимость для научного знания основоположник Джон Локк 16321704. Бэкон; рационализм Р.
34804. Рационализм декарта. Очевидность как критерий истины. Учение о врожденных истинах 44 KB
  С точки зрения Декарта непосредственные чувственные восприятия не подвергнутые анализу и проверке в свете разума могут вводить в заблуждение и не являться сами по себе гарантами достоверного познания. Скепсис Декарта скепсис методологический который должен привести к первичной достоверности. Философия Декарта является защитой не Божественного разума а нашего собственного земного человеческого.
34805. Учение о субстанции спинозы и Лейбница. Рационализм и проблема свободы 26 KB
  Субстанция одна она есть причина самой себя. Эта единая субстанция не нуждается ни в чем другом для того чтобы существовать. Природа творящая есть Бог единая субстанция. Субстанция обладает двумя главными атрибутами свойствами: 1 мышлением; 2 протяжением распространенностью Посредством этих свойств человеческий ум воспринимает субстанцию в ее конкретности.
34806. Эмпиризм: гоббс и локк. Скептицизм Юма. Субъективный идеализм Беркли 35 KB
  Юм выводит все идеи из чувственных впечатлений. Юм пытается доказать что субстанция и причинность не объективно существующие сущности не априорные идеи но что они по своему эмпирическому содержанию представляют собой исключительно ассоциации которые образуются благодаря привычным сочетаниям впечатлений. Среди постепенно появляющихся идей о вещах мы начинаем замечать определенное сходство которое позволяет дать этим понятиям одно и то же название оставляя в стороне возможные качественные и количественные различия и приобретаем...
34807. Философские идеи эпохи просвещения. Правовой идеал просвещения. Коллизия частного интереса и общей справедливости. Просветительная трактовка человека 37 KB
  Просветительная трактовка человека Выдающимися мыслителями философии Просвещения были Вольтер и Руссо Вольтер по праву считается основателем французского Просвещения. Огромное влияние на общественную жизнь Европы оказал другой представитель Просвещения Руссо. Руссо призывает к свободе. Отсюда такой интерес Руссо к принципу частной собственности с возникновением которой он связывает исчезновение первоначального равенства и чистоты общественных нравов.
34808. Кант: от субстанции у субъекту, от бытия к деятельности. Рассудок и проблема объективности познания. Явление «вещь в себе». Природа и свобода 29.5 KB
  Канта Философия Канта вершина всей истории философии до XX в. Все творчество Канта делится на два периода докритический и критический. В первый период основное внимание Кант уделял вопросам естествознания и философии природы. В нем излагается знаменитая гипотеза возникновения Вселенной из туманности что означает отказ от идеи первотолчка хотя Кант и признавал Бога в качестве создателя мира.