Разработка и использование библиотек

Содержание

Слайд 2

План лекции №3

Назначение и классификация библиотек;
Соглашения по вызову;
Создание статических

План лекции №3 Назначение и классификация библиотек; Соглашения по вызову; Создание статических
библиотек;
Использование статических библиотек;
Пример создания и использования;
Преимущества и недостатки статических библиотек.

Слайд 3

Назначение и классификация библиотек

Назначение:
Повторное использование кода.
Используются если:
Функции из библиотеки

Назначение и классификация библиотек Назначение: Повторное использование кода. Используются если: Функции из
будут использоваться в разных программах;
разрабатывается большой проект, часть функций уже отлажена - эту часть помещают в библиотеку (время трансляции кода уменьшается).

Слайд 4

Назначение и классификация библиотек

Классификация библиотек:
библиотеки на языках программирования (библиотеки классов,

Назначение и классификация библиотек Классификация библиотек: библиотеки на языках программирования (библиотеки классов,
шаблонов, функций…). Компилируются вместе с остальными исходными файлами проекта (не будут рассматриваться );
библиотеки объектных модулей (статические библиотеки). Компилируются вместе с остальными объектными файлами проекта (будут рассматриваться );
библиотеки исполняемых модулей (динамические библиотеки). Загружаются в память в момент запуска программы или во время ее исполнения, по мере надобности (будут рассматриваться ).

Слайд 5

Соглашения по вызовам

В одном приложении можно использовать библиотеки, написанные на разных

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

Слайд 6

Соглашения по вызовам
Заголовок функции:
Тип результата [Соглашение] Имя ([Параметры]);
Например:
int Sum(int , int);
void

Соглашения по вызовам Заголовок функции: Тип результата [Соглашение] Имя ([Параметры]); Например: int
__stdcall AddValues(int , int , int*);

Слайд 7

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

Создать проект для статической библиотеки: File->New->Projects-> Visual C++ -> Win32

Создание статических библиотек Создать проект для статической библиотеки: File->New->Projects-> Visual C++ ->
-> Win32 Console Application;
в ApplicationSettings выбрать Static library;
в каталог проекта «исходные файлы» добавить один или несколько файлов, содержащих реализации функций библиотеки;
в каталог проекта «заголовочные файлы» добавить заголовочный файл для библиотеки;
выбрать соглашение по вызову для функций;
6. создать библиотеку (построить проект) (файл.lib)

Слайд 8

Создание статических библиотек. Шаг 1

Создание статических библиотек. Шаг 1

Слайд 9

Создание статических библиотек. Шаг 2

Создание статических библиотек. Шаг 2

Слайд 10

Создание статических библиотек. Шаг 3

Создание статических библиотек. Шаг 3

Слайд 11

Создание статических библиотек. Шаг 3

Создание статических библиотек. Шаг 3

Слайд 12

Создание статических библиотек. Шаг 4

в каталог заголовочных файлов добавить заголовочный файл для

Создание статических библиотек. Шаг 4 в каталог заголовочных файлов добавить заголовочный файл для библиотеки
библиотеки

Слайд 13

Заголовочные файлы. Правила создания

В нем задают:
заголовки всех функций, которые входят

Заголовочные файлы. Правила создания В нем задают: заголовки всех функций, которые входят
в библиотеку (интерфейс библиотеки); (например: іnt summa (іnt *x, іnt n); )
типы пользователя; (например: typedef TCHAR char; )
константы. (например: #defіne MAXSІZE 4096 )
В нем не задают:
определение функций, например :
іnt summa (іnt *x, іnt n){
іnt s;
for (іnt i = 0; i < n; ++i)
s+= x[i];
return s;
}
определение данных , например іnt s = 0;

Слайд 14

Заголовочные файлы. Обеспечение одноразовой трансляции

Необходимо обеспечить трансляцию файла только один раз

Заголовочные файлы. Обеспечение одноразовой трансляции Необходимо обеспечить трансляцию файла только один раз
(в противном случае будет ошибка при повторном определении типа или константы с тем же именем).
#ifndef ПРОВЕРКА_КОНСТАНТЫ
#define ОПРЕДЕЛЕНИЕ_КОНСТАНТЫ

#endif

Слайд 15

Разработать библиотеку для выполнения арифметических операций: сложения с учетом возможного переполнения

Разработать библиотеку для выполнения арифметических операций: сложения с учетом возможного переполнения (+)
(+) и вычисления НОД для 32 битных чисел.
Требования:
числа беззнаковые;
при поиске НОД используется алгоритм вычитания меньшего числа из большего;

Пример статической библиотеки

Слайд 16

z = x + y;
Как определить был перенос или нет?
7 1

z = x + y; Как определить был перенос или нет? 7
x f
+ 8 + 7 + y + f
------ ----- ----- -----
5 8 z e
Carry =1, если z < x или z < y;
========================================================
Наибольший общий делитель : НОД(x,y)
x=10, y=15
15-10=5
10-5=5
5-5=0
НОД(10,15)=5

Алгоритмы

Слайд 17

// LibHeader.h
#ifndef _LIB_HEADER_H
#define _LIB_HEADER_H
unsigned int __stdcall AddWithCarry( unsigned int

// LibHeader.h #ifndef _LIB_HEADER_H #define _LIB_HEADER_H unsigned int __stdcall AddWithCarry( unsigned int
, unsigned int, unsigned int*);
void __stdcall NOD( unsigned int a, unsigned int b, unsigned int* r);
#endif

Заголовочный файл (LibHeader.h)

Слайд 18

// StaticLib.cpp
#include "stdafx.h"
#include "LibHeader.h"
unsigned int __stdcall AddWithCarry( unsigned int a, unsigned

// StaticLib.cpp #include "stdafx.h" #include "LibHeader.h" unsigned int __stdcall AddWithCarry( unsigned int
int b, unsigned int* r)
{
unsigned int carry=0;
unsigned int c=a+b;
if (c carry=1;
*r=c;
return carry;
}
(продолжение на следующем слайде)

Реализация функций (StaticLib.cpp)

Слайд 19

( Продолжение. Начало на предыдущем на следующем слайде )
void __stdcall NOD(

( Продолжение. Начало на предыдущем на следующем слайде ) void __stdcall NOD(
unsigned int a, unsigned int b, unsigned int* r)
{
unsigned int f=a, s=b;
while( f&&s )
{
if ( f>s )
f=f-s;
else
s=s-f;
}
if (f)
*r=f;
else
*r=s;
}

Реализация функций (StaticLib.cpp)

Слайд 20

Построение статической библиотеки.

если в Решении (Solution) несколько проектов - выбрать

Построение статической библиотеки. если в Решении (Solution) несколько проектов - выбрать пункт
пункт контекстного меню Set As StartUp Project;
далее
выбрать пункт меню Построение (Build)
В результате построения проекта Static Library получим файл .lib в каталоге Debug Вашего Решения (Solution)
(если текущая конфигурация - Debug)

Слайд 21

Главная программа для использования статической библиотеки. Создание

Главная программа для использования статической библиотеки. Создание

Слайд 22

Главная программа для использования статической библиотеки. Создание

Главная программа для использования статической библиотеки. Создание

Слайд 23

Главная программа для использования статической библиотеки. Создание

в ApplicationSettings оставить Console Application

Главная программа для использования статической библиотеки. Создание в ApplicationSettings оставить Console Application
и Precompiled header;
Откроется исходный файл созданного проекта со следующим содержанием

Слайд 24

Главная программа для использования статической библиотеки. Настройки.
Использовать контекстное меню
или
выбрать
пункт главного меню

Главная программа для использования статической библиотеки. Настройки. Использовать контекстное меню или выбрать

Project-> Properties ->
Configuration Properties->
C/C++->General->
Additional Include Directories
установить как
..\ИМЯ_ПРОЕКТА_СТАТИЧЕСКАЯ_БИБЛ;
(заголовочный файл один на все проекты
в Решении (Solution))

Слайд 25

Главная программа для использования статической библиотеки. Настройки.

Главная программа для использования статической библиотеки. Настройки.

Слайд 26

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

В одном Решении (Solution) создать 2 проекта: проект

Использование статических библиотек. Рекомендации В одном Решении (Solution) создать 2 проекта: проект
для библиотеки и проект с главной программой.
для обоих проектов результирующий каталог должен быть один и тот же
меню Project-> Properties -> Configuration Properties-> General-> Output Directory -> $(SolutionDir)$(ConfigurationName)\

Слайд 27

#include "stdafx.h"
#include "LibHeader.h"
unsigned int first=0xffffffff, second=0xffffffff, result, carry;
int _tmain(int argc, _TCHAR* argv[])
{
carry=AddWithCarry(first,

#include "stdafx.h" #include "LibHeader.h" unsigned int first=0xffffffff, second=0xffffffff, result, carry; int _tmain(int
second, &result);
_tprintf(_T("%x+%x= %x %x\n"), first, second, carry, result);
NOD(75,10,&result);
_tprintf(_T("NOD for %u and %u = %u"),75,10,result);
return 0;
}

Главная программа TestStaticLib.cpp. (для вызова функций из библиотеки StaticLib)

Слайд 28

Главная программа для использования статической библиотеки. Ссылка на библиотеку.

Пункт меню Project->References.. ->Add

Главная программа для использования статической библиотеки. Ссылка на библиотеку. Пункт меню Project->References..
New Reference..->выбрать имя проекта с библ.

Слайд 29

Главная программа для использования статической библиотеки . Построение и запуск программы.

выбрать

Главная программа для использования статической библиотеки . Построение и запуск программы. выбрать
пункт меню Set As StartUp Project;
далее
выбрать пункт меню Build ->
Build TestStaticLib или воспользоваться контекстным меню.
далее
выбрать пункт главного меню Debug ->
Start Without Debugging (Ctrl+F5)
или Start Debugging (F5)
Поставить точку останова и в пошаговом режиме отладить программу (F10, F11)

Слайд 30

Каталоги с Решением (solution), содержащим оба проекта.

Имя Решения обычно совпадает с

Каталоги с Решением (solution), содержащим оба проекта. Имя Решения обычно совпадает с
именем первого созданного в нем Проекта (Project).
Имя Решения:
StaticLib
Имя проекта со
статической библиотекой:
StaticLib
Имя проекта с главной
Программой, которая
тестирует функции из
статической библиотеки:
TestStaticLib

Слайд 31

Главная программа для использования статической библиотеки . Результаты работы программы: на экран

Главная программа для использования статической библиотеки . Результаты работы программы: на экран
или в файл.

Запуск программы из командной строки:
TestStaticLib.exe > output.txt
Файл с результатами output.txt:
ffffffff+ffffffff= 1 fffffffe
NOD for 75 and 10 = 5

Слайд 32

Достоинства:
просто использовать;
исполняемый файл один (.exe).
Недостатки:
платформенно зависима;
загружается в память с каждым экземпляром запущенного

Достоинства: просто использовать; исполняемый файл один (.exe). Недостатки: платформенно зависима; загружается в
приложения;
при изменении кода библиотеки необходима компоновка всех приложений, которые используют библиотеку

Достоинства и недостатки статических библиотек

Слайд 33

библиотеки применяются для повторного использования кода;
статическая библиотека - это библиотека

библиотеки применяются для повторного использования кода; статическая библиотека - это библиотека объектных
объектных модулей;
для использования статической библиотеки необходимо иметь саму библиотеку (.lib) в формате среды (IDE), в которой она будет использоваться, и заголовочный файл (.h) с определением заголовков функций библиотеки;
отсутствуют накладные затраты, связанные с использованием динамических библиотек.

Итоги:

Слайд 34

План лекции №4

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

План лекции №4 Создание динамических библиотек; Использование динамических библиотек. Статический режим; Использование
динамических библиотек. Динамический режим;
Пример создания и использования;
Преимущества и недостатки разных режимов использования.

Слайд 35

Динамические библиотеки (Dynamіc Lіnk Lіbrary - DLL)
Загружаются одновременно с

Динамические библиотеки (Dynamіc Lіnk Lіbrary - DLL) Загружаются одновременно с программой (статическая
программой (статическая загрузка) или во время ее выполнения по мере надобности (динамическая загрузка).
Функция, которая экспортируется (внешняя функция) - это функция, которая входит в состав DLL, и которую могут использовать внешние программы.
(в статических библиотеках - все функции экспортируются).
Для обозначения внешних функций используется директива:
__declspec (dllexport)

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

Слайд 36

Функция, которая импортируется - это функция из DLL, которая вызывается (используется) в

Функция, которая импортируется - это функция из DLL, которая вызывается (используется) в
другой программе.
Функции, которые импортируются, обозначаются директивой:
__declspec (dllіmport)
Таким образом, одна и та же функция:
внутри самой DLL является функцией, которая экспортируется;
для главной программы - функцией, которая импортируется.
Внутренняя функция библиотеки может быть вызвана только функциями внутри библиотеки.

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

Слайд 37

Исходя из вышесказанного, в файле заголовков (.h) информация о внешних функциях

Исходя из вышесказанного, в файле заголовков (.h) информация о внешних функциях должна
должна быть разной:
для самой библиотеки .dll - экспорт ,
а для главной программы - импорт!
(пример: страны экспортеры и импортеры)

Обозначение функций

Слайд 38

#ifndef _UNIVERSAL_H
#define _UNIVERSAL_H
#ifdef _STATIC
#define PREFIX
#else
#ifdef _USRDLL
#define PREFIX __declspec(dllexport)

#ifndef _UNIVERSAL_H #define _UNIVERSAL_H #ifdef _STATIC #define PREFIX #else #ifdef _USRDLL #define
#else
#define PREFIX __declspec(dllimport)
#endif
#endif
PREFIX unsigned int __stdcall AddWithCarry( unsigned int , unsigned int, unsigned int*);
PREFIX void __stdcall NOD( unsigned int a, unsigned int b, unsigned int* r);
#endif

Универсальный заголовочный файл (universal.h)

Слайд 39

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

Создание:
Выбрать проект типа Visual C++-> Win32; в ApplicationSettings выбрать DLL
Добавить в

Динамические библиотеки Создание: Выбрать проект типа Visual C++-> Win32; в ApplicationSettings выбрать
проект универсальный заголовочный файл;
Добавить в проект файл с текстом функций;
Построить проект. В результате будут получены 2 файла: <имя>.lib и <имя>.dll;
Использование:
Использования динамической библиотеки в режимах статической и динамической загрузки.

Слайд 40

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

1 Статическая загрузка (загрузка во время загрузки приложения, которое использует DLL)

Динамические библиотеки 1 Статическая загрузка (загрузка во время загрузки приложения, которое использует
- если нет необходимой DLL - приложение не начнет выполняться;
2 Динамическая загрузка (загрузка и выгрузка по необходимости время выполнения приложения, которое использует DLL) - загружаются только те DLL, из которых будут вызываться функции, после окончания использования память можно освободить, не дожидаясь окончания работы главной программы.

Слайд 41

DEF файл

Добавляется в проект DLL (в папку ресурсов) для сохранения возможности

DEF файл Добавляется в проект DLL (в папку ресурсов) для сохранения возможности
обращения к функциям по именам без преобразования при использовании DLL в режиме динамической загрузки.
EXPORTS
Имя функции 1
Имя функции 2

=====================================================================================================================
DynamicLib.def:
LIBRARY "DynamicLib"
EXPORTS
AddWithCarry
NOD

Слайд 42

Правила использования функций WIN API

Необходимо подключить заголовочный файл Windows.h
Все функции имеют соглашения

Правила использования функций WIN API Необходимо подключить заголовочный файл Windows.h Все функции
по вызову __stdcall (WINAPI)
Все типы и константы Windows задаются заглавными буквами, например, DWORD – unsigned int , WORD – short, HMODULE - int, INVALID_HANDLE_VALUE.
Каждое слово в имени функции начинается с заглавной буквы, например, LoadLibrary.
Функция может завершиться успешно или неуспешно – BOOL (0 – false, 1 – true…).
Если она возвращает дескриптор, то в случае ошибки:
0 или INVALID_HANDLE_VALUE.

Слайд 43

Функции для работы с DLL в режиме динамической загрузки
HMODULE WINAPI LoadLibrary(

Функции для работы с DLL в режиме динамической загрузки HMODULE WINAPI LoadLibrary(
LPCTSTR lpFileName );
BOOL WINAPI FreeLibrary( HMODULE hModule );
FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName );
DWORD WINAPI GetDllDirectory( DWORD nBufferLength, LPTSTR lpBuffer);

Слайд 44

Алгоритм поиска DLL

Каталог, в котором находится исполняемый модуль текущего процесса.
Текущий каталог (GetCurrentDirectory).
Системный

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

Слайд 45

Главная программа для DLL в режиме динамической загрузки

#include "stdafx.h"
#include
#include
#include “universal.h“
typedef

Главная программа для DLL в режиме динамической загрузки #include "stdafx.h" #include #include
unsigned int (__stdcall *ADDWITHCARRY)( unsigned int , unsigned int, unsigned int*);
typedef void (__stdcall *NODD) ( unsigned int , unsigned int, unsigned int*);
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int first=0xffffffff,second=0xffffffff, result, carry;
HINSTANCE h=LoadLibrary(_T("Lecture_dynamic_library.dll"));
if (h==NULL)
_tprintf(_T("Library not found"));
else
{ ADDWITHCARRY adr1=(ADDWITHCARRY)GetProcAddress(h,"AddWithCarry");
NODD adr2=(NODD)GetProcAddress(h,"NOD");
carry=adr1(first,second,&result);
_tprintf(_T("%x+%x= %x %x\n"),first,second,carry,result);
adr2(75,10,&result);
_tprintf(_T("NOD for %u and %u = %u"),75,10,result);
}
return 0;
}