4882

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

Лекция

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

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

Русский

2012-11-28

200.5 KB

37 чел.

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

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

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


 

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

34926. Возникновение, сущность, виды и функции денег 57 KB
  О наличии денег на хранении выдавался сертификат квитанция который удостоверял что деньги находятся у банкира на хранении и предъявитель сей бумаги получит определённую сумму. Со временем эти сертификаты стали иметь такую же силу как и реальные деньги. Так появились первые бумажные деньги возникшие из практики использования банковских сертификатов квитанций. Деньги специфический товар который является универсальным эквивалентом стоимости других товаров или услуг.
34927. Государственный бюджет 26 KB
  Деятельность государства по формированию рассмотрению утверждению исполнению бюджета а также составлению и утверждению отчёта об его исполнении формулировка касается бюджетов всех уровней входящих в бюджетную систему РФ называется бюджетный проце́сс. Если запланированные расходы бюджета превышают доходы бюджета то это называется бюджетный дефицит или дефицит бюджета. Когда при исполнении бюджета уровень дефицита бюджета превышает установленный при утверждении бюджета показатель или происходит значительное снижение ожидавшихся...
34928. Государственный долг. Экономический анализ государственного долга 28 KB
  Государственный долг возникает вследствие существования дефицита бюджета в определенные периоды времени. Когда расходы государства превышают его доходы, правительство вынужденно искать источники финансирования возникшего разрыва.
34929. Группы издержек производства 36.5 KB
  Внешние(явные, бухгалтерские) – денежные платежи, которые производит фирма за приобретенные ресурсы поставщику, обеспечивающие его таким доходом, чтобы он не направлял ресурсы в альтернативное производство, образует себестоимость
34930. Денежные теории 40 KB
  Фридмен реформировал количественную теорию денег основываясь на существующих разработках трансакционном варианте и. По мнению Фридмена деньги имеют значение для динамики цен и что важно именно количество денег а не процентные ставки влияют на состояние денежного рынка или условия выдачи кредитов. В монетаристском варианте количественной теории денег важное место отводится ожидаемым изменениям уровня цен как фактора действующего на размеры кассовых денежных резервов и других финансовых активов находящихся в распоряжении...
34931. Закон Оукена. Экономический смысл. Социально-экономические последствия безработицы 33 KB
  Социальноэкономические последствия безработицы. Закон Оукена эмпирическая зависимость между темпом роста безработицы и темпом роста ВНП в США начала 60х годов предполагающая что превышение уровня безработицы на 1 над уровнем естественной безработицы снижает реальный ВНП по сравнению с потенциальным на 25 . Y − Y Y = − Buc Y фактический ВНП Y потенциальный ВНП uc уровень циклической безработицы B эмпирический коэффициент чувствительности обычно принимается 2. Следствие из закона Оукена: Y1 − Y0 Y0 =...
34932. Законы Госсена и аксиомы порядкового подхода 42.5 KB
  Субъект будет распределять свои расходы таким образом что отношение предельной полезности к цене будет одинаковым для всех товаров и экономических услуг: U полезность xi количество iго товара или услуги pi цена iго товара или услуги Порядковый подход к анализу полезности и спроса базируется на следующих аксиомах: Аксиома полной совершенной упорядоченности. Аксиома транзитивности. Эта аксиома гарантирует согласованность предпочтений. Аксиома транзитивности содержит и еще одно утверждение а именно: если А В и В С то А С.
34933. Индексы цен 27.5 KB
  Методика принципов расчета индексов цен: определение набора товаров; выбор базовых объектов путем репрезентативной выборки предприятий различных отраслей торговли сферы услуг; выбор системы взвешивания показателей и формулы расчета индексов. Расчеты индексов цен обеспечивают построение индексов фактических цен и индексов средних цен. Индекс средних цен учитывает наряду с изменением цен на отдельные товары структурные изменения.