4882

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

Лекция

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

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

Русский

2012-11-28

200.5 KB

36 чел.

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

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

Статические библиотеки (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.


 

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

28919. Социально-экономическая политика советского государства (1921-1941 гг.) 41.5 KB
  Речь шла о необходимости превращения СССР из страны ввозящий машины и оборудование в страну производящую их. На рубеже 2030 годов руководство страны приняло курс на форсирование индустриального развития. Руководство страны решило выдвинуть лозунг догнать и перегнать в кратчайшие сроки в техникоэкономическом отношении передовые капиталистические страны. За ним стояло желание в кратчайшие сроки любой ценой ликвидировать отсталость страны и построить новое общество.
28920. НАЦИОНАЛЬНАЯ ПОЛИТИКА СОВЕТСКОГО ГОСУДАРСТВА. ОБРАЗОВАНИЕ СССР 23 KB
  ОБРАЗОВАНИЕ СССР После Октябрьской революции и победы большевиков одним из первых декретов новой власти стала Декларация прав народов России провозглашавшая равенство и суверенность всех народов их право на самоопределение вплоть до отделения и образования самостоятельных государств свободное развитие всех национальных меньшинств. После Гражданской войны начался процесс объединительного движения которое привело к образованию новой российской государственности СССР. съезд полномочных представителей данных республик I съезд Советов Союза...
28921. Культурное строительство в СССР (1921-1941 гг.) 40.5 KB
  Советский период это сложное и противоречивое явление в развитии не только нашей истории но и культуры. Отличительной особенностью советского периода истории культуры является огромная роль в ее развитии партии и государства. Государство взяло на себя финансирование всех отраслей культуры: образование материальнотехническое обеспечение все виды искусства установив строжайшую цензуру над литературой театром кинематографом учебными заведениями и т. В спецхранилищах оказались произведения писателей художников и других представителей...
28922. Советское государство и мир (1921-1941 гг.) 43.5 KB
  Согласно ему СССР поддерживал коммунистическое национально-освободительное движение в мире; прагматической концепции мирном сосуществовании государств с различным общественным строем. В результате СССР в основном сумел преодолеть состояние дипломатической изоляции. Япония развязала боевые действия против СССР и Монголии в районе реки ХалхинГол. для СССР стала реальной угроза войны на два фронта.
28923. Первый период ВОВ. Перестройка страны на военный лад 23.5 KB
  Начало войны стало катастрофой для Красной Армии. Обескровленная репрессиями и в результате оперативностратегических промахов уже за первые три недели войны Красная Армия потеряла около 850 тыс. Преодолев шок первых месяцев войны правящий режим СССР смог использовать такие преимущества как сверхцентрализация управления огромные природные и людские ресурсы обеспечив предельное напряжение всех сил народа. В результате в первые полгода войны несмотря на трудности связанные с немецким наступлением летомосенью 1941 удалось эвакуировать на...
28924. Коренной перелом в ходе войны и ее победоносное завершение. Значение Великой Победы 23.5 KB
  Коренной перелом в ходе войны и ее победоносное завершение. явилось периодом коренного перелома в ходе Великой Отечественной войны. Вопервых в этот период Красная Армия окончательно вырвала инициативу военных действий из рук врага и закрепила за собой до конца войны; вовторых наша армия провела большое летнее наступление против армий противника и тем самым похоронила фашистский миф о том что советские войска будто бы неспособны вести успешное наступление в летнее время; втретьих в этот период Красная Армия осуществляла массовое изгнание...
28925. Завершение Второй Мировой Войны 21 KB
  На конференции было решено не ограничивать сроки оккупации Германии для управления которой создавался союзный контрольный совет. В дни Потсдамской конференции произошло еще одно событие которому было суждено оказать серьезное влияние на послевоенную историю мира. На этой конференции американский президент Г. в соответствии с обязательствами принятыми на Ялтинской конференции СССР объявил Японии войну.
28926. Смутное время, его причины и последствия 28 KB
  Это первая в истории России гражданская война В апреле 1605 года царь Борис Годунов умер трон перешел к его сыну Федору В июне 1605 года Лжедмитрий с огромным войском вступил в Москву. Лжедмитрий 1 щедро раздавал деньги и земли дворянству чтобы заручиться его поддержкой был деятельным и энергичным. Шуйским подняли народ против поляков Лжедмитрий 1 был убит. В 1607 году появляется новый самозванец Лжедмитрий II личность которого так и не была установлена.
28927. Приход к власти в России царской династии Романовых. Становление российского абсолютизма 28.5 KB
  21 февраля казаки ворвались на заседание Земского собора и потребовали избрать царем 16летнего Михаила Федоровича Романова сына патриарха Филарета родственника царя Федора Ивановича. Избрание Михаила не было случайностью: один из бояр писал что Михаил молод разумом еще не дошел и будет нам удобен; отсутствие у Михаила ярких талантов жесткого характера устраивало всех: страна устала от жестокости и хотела осторожной политики; избрание Михаила обещало всеобщее согласие и спокойствие; царская власть опять становилась...